diff --git a/.editorconfig b/.editorconfig index cc2facfda..353ee1ffd 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3657 +1,3657 @@ -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -# Standard properties -csharp_indent_labels = one_less_than_current -# Microsoft .NET properties -csharp_indent_braces=false -csharp_indent_switch_labels=true -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_open_brace=all -csharp_new_line_between_query_expression_clauses=true -csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion -csharp_preserve_single_line_blocks=true -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_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 -csharp_style_namespace_declarations= file_scoped:suggestion -csharp_style_var_elsewhere= true:suggestion -csharp_style_var_for_built_in_types= true:suggestion -csharp_style_var_when_type_is_apparent= true:suggestion -csharp_using_directive_placement= outside_namespace:silent -dotnet_diagnostic.bc40000.severity=warning -dotnet_diagnostic.bc400005.severity=warning -dotnet_diagnostic.bc40008.severity=warning -dotnet_diagnostic.bc40056.severity=warning -dotnet_diagnostic.bc42016.severity=warning -dotnet_diagnostic.bc42024.severity=warning -dotnet_diagnostic.bc42025.severity=warning -dotnet_diagnostic.bc42104.severity=warning -dotnet_diagnostic.bc42105.severity=warning -dotnet_diagnostic.bc42106.severity=warning -dotnet_diagnostic.bc42107.severity=warning -dotnet_diagnostic.bc42304.severity=warning -dotnet_diagnostic.bc42309.severity=warning -dotnet_diagnostic.bc42322.severity=warning -dotnet_diagnostic.bc42349.severity=warning -dotnet_diagnostic.bc42353.severity=warning -dotnet_diagnostic.bc42354.severity=warning -dotnet_diagnostic.bc42355.severity=warning -dotnet_diagnostic.bc42356.severity=warning -dotnet_diagnostic.bc42358.severity=warning -dotnet_diagnostic.bc42504.severity=warning -dotnet_diagnostic.bc42505.severity=warning -dotnet_diagnostic.cs0067.severity=warning -dotnet_diagnostic.cs0078.severity=warning -dotnet_diagnostic.cs0108.severity=warning -dotnet_diagnostic.cs0109.severity=warning -dotnet_diagnostic.cs0114.severity=warning -dotnet_diagnostic.cs0162.severity=warning -dotnet_diagnostic.cs0164.severity=warning -dotnet_diagnostic.cs0168.severity=warning -dotnet_diagnostic.cs0169.severity=warning -dotnet_diagnostic.cs0183.severity=warning -dotnet_diagnostic.cs0184.severity=warning -dotnet_diagnostic.cs0197.severity=warning -dotnet_diagnostic.cs0219.severity=warning -dotnet_diagnostic.cs0252.severity=warning -dotnet_diagnostic.cs0253.severity=warning -dotnet_diagnostic.cs0414.severity=warning -dotnet_diagnostic.cs0420.severity=warning -dotnet_diagnostic.cs0465.severity=warning -dotnet_diagnostic.cs0469.severity=warning -dotnet_diagnostic.cs0612.severity=warning -dotnet_diagnostic.cs0618.severity=warning -dotnet_diagnostic.cs0628.severity=warning -dotnet_diagnostic.cs0642.severity=warning -dotnet_diagnostic.cs0649.severity=warning -dotnet_diagnostic.cs0652.severity=warning -dotnet_diagnostic.cs0657.severity=warning -dotnet_diagnostic.cs0658.severity=warning -dotnet_diagnostic.cs0659.severity=warning -dotnet_diagnostic.cs0660.severity=warning -dotnet_diagnostic.cs0661.severity=warning -dotnet_diagnostic.cs0665.severity=warning -dotnet_diagnostic.cs0672.severity=warning -dotnet_diagnostic.cs0675.severity=warning -dotnet_diagnostic.cs0693.severity=warning -dotnet_diagnostic.cs1030.severity=warning -dotnet_diagnostic.cs1058.severity=warning -dotnet_diagnostic.cs1066.severity=warning -dotnet_diagnostic.cs1522.severity=warning -dotnet_diagnostic.cs1570.severity=warning -dotnet_diagnostic.cs1571.severity=warning -dotnet_diagnostic.cs1572.severity=warning -dotnet_diagnostic.cs1573.severity=warning -dotnet_diagnostic.cs1574.severity=warning -dotnet_diagnostic.cs1580.severity=warning -dotnet_diagnostic.cs1581.severity=warning -dotnet_diagnostic.cs1584.severity=warning -dotnet_diagnostic.cs1587.severity=warning -dotnet_diagnostic.cs1589.severity=warning -dotnet_diagnostic.cs1590.severity=warning -dotnet_diagnostic.cs1591.severity=warning -dotnet_diagnostic.cs1592.severity=warning -dotnet_diagnostic.cs1710.severity=warning -dotnet_diagnostic.cs1711.severity=warning -dotnet_diagnostic.cs1712.severity=warning -dotnet_diagnostic.cs1717.severity=warning -dotnet_diagnostic.cs1723.severity=warning -dotnet_diagnostic.cs1911.severity=warning -dotnet_diagnostic.cs1957.severity=warning -dotnet_diagnostic.cs1981.severity=warning -dotnet_diagnostic.cs1998.severity=warning -dotnet_diagnostic.cs4014.severity=warning -dotnet_diagnostic.cs7022.severity=warning -dotnet_diagnostic.cs7023.severity=warning -dotnet_diagnostic.cs7095.severity=warning -dotnet_diagnostic.cs8094.severity=warning -dotnet_diagnostic.cs8123.severity=warning -dotnet_diagnostic.cs8321.severity=warning -dotnet_diagnostic.cs8383.severity=warning -dotnet_diagnostic.cs8416.severity=warning -dotnet_diagnostic.cs8417.severity=warning -dotnet_diagnostic.cs8424.severity=warning -dotnet_diagnostic.cs8425.severity=warning -dotnet_diagnostic.cs8509.severity=warning -dotnet_diagnostic.cs8524.severity=warning -dotnet_diagnostic.cs8597.severity=warning -dotnet_diagnostic.cs8600.severity=warning -dotnet_diagnostic.cs8601.severity=warning -dotnet_diagnostic.cs8602.severity=warning -dotnet_diagnostic.cs8603.severity=warning -dotnet_diagnostic.cs8604.severity=warning -dotnet_diagnostic.cs8605.severity=warning -dotnet_diagnostic.cs8607.severity=warning -dotnet_diagnostic.cs8608.severity=warning -dotnet_diagnostic.cs8609.severity=warning -dotnet_diagnostic.cs8610.severity=warning -dotnet_diagnostic.cs8611.severity=warning -dotnet_diagnostic.cs8612.severity=warning -dotnet_diagnostic.cs8613.severity=warning -dotnet_diagnostic.cs8614.severity=warning -dotnet_diagnostic.cs8615.severity=warning -dotnet_diagnostic.cs8616.severity=warning -dotnet_diagnostic.cs8617.severity=warning -dotnet_diagnostic.cs8618.severity=warning -dotnet_diagnostic.cs8619.severity=warning -dotnet_diagnostic.cs8620.severity=warning -dotnet_diagnostic.cs8621.severity=warning -dotnet_diagnostic.cs8622.severity=warning -dotnet_diagnostic.cs8624.severity=warning -dotnet_diagnostic.cs8625.severity=warning -dotnet_diagnostic.cs8629.severity=warning -dotnet_diagnostic.cs8631.severity=warning -dotnet_diagnostic.cs8632.severity=none -dotnet_diagnostic.cs8633.severity=warning -dotnet_diagnostic.cs8634.severity=warning -dotnet_diagnostic.cs8643.severity=warning -dotnet_diagnostic.cs8644.severity=warning -dotnet_diagnostic.cs8645.severity=warning -dotnet_diagnostic.cs8655.severity=warning -dotnet_diagnostic.cs8656.severity=warning -dotnet_diagnostic.cs8667.severity=warning -dotnet_diagnostic.cs8669.severity=none -dotnet_diagnostic.cs8670.severity=warning -dotnet_diagnostic.cs8714.severity=warning -dotnet_diagnostic.cs8762.severity=warning -dotnet_diagnostic.cs8763.severity=warning -dotnet_diagnostic.cs8764.severity=warning -dotnet_diagnostic.cs8765.severity=warning -dotnet_diagnostic.cs8766.severity=warning -dotnet_diagnostic.cs8767.severity=warning -dotnet_diagnostic.cs8768.severity=warning -dotnet_diagnostic.cs8769.severity=warning -dotnet_diagnostic.cs8770.severity=warning -dotnet_diagnostic.cs8774.severity=warning -dotnet_diagnostic.cs8775.severity=warning -dotnet_diagnostic.cs8776.severity=warning -dotnet_diagnostic.cs8777.severity=warning -dotnet_diagnostic.cs8794.severity=warning -dotnet_diagnostic.cs8819.severity=warning -dotnet_diagnostic.cs8824.severity=warning -dotnet_diagnostic.cs8825.severity=warning -dotnet_diagnostic.cs8846.severity=warning -dotnet_diagnostic.cs8847.severity=warning -dotnet_diagnostic.cs8851.severity=warning -dotnet_diagnostic.cs8860.severity=warning -dotnet_diagnostic.cs8892.severity=warning -dotnet_diagnostic.cs8907.severity=warning -dotnet_diagnostic.cs8947.severity=warning -dotnet_diagnostic.cs8960.severity=warning -dotnet_diagnostic.cs8961.severity=warning -dotnet_diagnostic.cs8962.severity=warning -dotnet_diagnostic.cs8963.severity=warning -dotnet_diagnostic.cs8965.severity=warning -dotnet_diagnostic.cs8966.severity=warning -dotnet_diagnostic.cs8971.severity=warning -dotnet_diagnostic.wme006.severity=warning -dotnet_naming_rule.constants_rule.import_to_resharper=as_predefined -dotnet_naming_rule.constants_rule.severity = warning -dotnet_naming_rule.constants_rule.style = upper_camel_case_style -dotnet_naming_rule.constants_rule.symbols=constants_symbols -dotnet_naming_rule.event_rule.import_to_resharper=as_predefined -dotnet_naming_rule.event_rule.severity = warning -dotnet_naming_rule.event_rule.style = upper_camel_case_style -dotnet_naming_rule.event_rule.symbols=event_symbols -dotnet_naming_rule.interfaces_rule.import_to_resharper=as_predefined -dotnet_naming_rule.interfaces_rule.severity = warning -dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style -dotnet_naming_rule.interfaces_rule.symbols=interfaces_symbols -dotnet_naming_rule.locals_rule.import_to_resharper=as_predefined -dotnet_naming_rule.locals_rule.severity = warning -dotnet_naming_rule.locals_rule.style = lower_camel_case_style_1 -dotnet_naming_rule.locals_rule.symbols=locals_symbols -dotnet_naming_rule.local_constants_rule.import_to_resharper=as_predefined -dotnet_naming_rule.local_constants_rule.severity = warning -dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style_1 -dotnet_naming_rule.local_constants_rule.symbols=local_constants_symbols -dotnet_naming_rule.local_functions_rule.import_to_resharper=as_predefined -dotnet_naming_rule.local_functions_rule.severity = warning -dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style -dotnet_naming_rule.local_functions_rule.symbols=local_functions_symbols -dotnet_naming_rule.method_rule.import_to_resharper=as_predefined -dotnet_naming_rule.method_rule.severity = warning -dotnet_naming_rule.method_rule.style = upper_camel_case_style -dotnet_naming_rule.method_rule.symbols=method_symbols -dotnet_naming_rule.parameters_rule.import_to_resharper=as_predefined -dotnet_naming_rule.parameters_rule.severity = warning -dotnet_naming_rule.parameters_rule.style = lower_camel_case_style_1 -dotnet_naming_rule.parameters_rule.symbols=parameters_symbols -dotnet_naming_rule.private_constants_rule.import_to_resharper=as_predefined -dotnet_naming_rule.private_constants_rule.severity = warning -dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style -dotnet_naming_rule.private_constants_rule.symbols=private_constants_symbols -dotnet_naming_rule.private_instance_fields_rule.import_to_resharper=as_predefined -dotnet_naming_rule.private_instance_fields_rule.severity = warning -dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style -dotnet_naming_rule.private_instance_fields_rule.symbols=private_instance_fields_symbols -dotnet_naming_rule.private_static_fields_rule.import_to_resharper=as_predefined -dotnet_naming_rule.private_static_fields_rule.severity = warning -dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style -dotnet_naming_rule.private_static_fields_rule.symbols=private_static_fields_symbols -dotnet_naming_rule.private_static_readonly_rule.import_to_resharper=as_predefined -dotnet_naming_rule.private_static_readonly_rule.severity = warning -dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style -dotnet_naming_rule.private_static_readonly_rule.symbols=private_static_readonly_symbols -dotnet_naming_rule.property_rule.import_to_resharper=as_predefined -dotnet_naming_rule.property_rule.severity = warning -dotnet_naming_rule.property_rule.style = upper_camel_case_style -dotnet_naming_rule.property_rule.symbols=property_symbols -dotnet_naming_rule.public_fields_rule.import_to_resharper=as_predefined -dotnet_naming_rule.public_fields_rule.severity = warning -dotnet_naming_rule.public_fields_rule.style = upper_camel_case_style -dotnet_naming_rule.public_fields_rule.symbols=public_fields_symbols -dotnet_naming_rule.static_readonly_rule.import_to_resharper=as_predefined -dotnet_naming_rule.static_readonly_rule.severity = warning -dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style -dotnet_naming_rule.static_readonly_rule.symbols=static_readonly_symbols -dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper=as_predefined -dotnet_naming_rule.types_and_namespaces_rule.severity = warning -dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style -dotnet_naming_rule.types_and_namespaces_rule.symbols=types_and_namespaces_symbols -dotnet_naming_rule.type_parameters_rule.import_to_resharper=as_predefined -dotnet_naming_rule.type_parameters_rule.severity = warning -dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style -dotnet_naming_rule.type_parameters_rule.symbols=type_parameters_symbols -dotnet_naming_style.i_upper_camel_case_style.capitalization=pascal_case -dotnet_naming_style.i_upper_camel_case_style.required_prefix=I -dotnet_naming_style.lower_camel_case_style.capitalization=camel_case -dotnet_naming_style.lower_camel_case_style.required_prefix=_ -dotnet_naming_style.lower_camel_case_style_1.capitalization=camel_case -dotnet_naming_style.t_upper_camel_case_style.capitalization=pascal_case -dotnet_naming_style.t_upper_camel_case_style.required_prefix=T -dotnet_naming_style.upper_camel_case_style.capitalization=pascal_case -dotnet_naming_symbols.constants_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected -dotnet_naming_symbols.constants_symbols.applicable_kinds=field -dotnet_naming_symbols.constants_symbols.required_modifiers=const -dotnet_naming_symbols.event_symbols.applicable_accessibilities=* -dotnet_naming_symbols.event_symbols.applicable_kinds=event -dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities=* -dotnet_naming_symbols.interfaces_symbols.applicable_kinds=interface -dotnet_naming_symbols.locals_symbols.applicable_accessibilities=* -dotnet_naming_symbols.locals_symbols.applicable_kinds=local -dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities=* -dotnet_naming_symbols.local_constants_symbols.applicable_kinds=local -dotnet_naming_symbols.local_constants_symbols.required_modifiers=const -dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities=* -dotnet_naming_symbols.local_functions_symbols.applicable_kinds=local_function -dotnet_naming_symbols.method_symbols.applicable_accessibilities=* -dotnet_naming_symbols.method_symbols.applicable_kinds=method -dotnet_naming_symbols.parameters_symbols.applicable_accessibilities=* -dotnet_naming_symbols.parameters_symbols.applicable_kinds=parameter -dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities=private -dotnet_naming_symbols.private_constants_symbols.applicable_kinds=field -dotnet_naming_symbols.private_constants_symbols.required_modifiers=const -dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities=private -dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds=field -dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities=private -dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds=field -dotnet_naming_symbols.private_static_fields_symbols.required_modifiers=static -dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities=private -dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds=field -dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers=static,readonly -dotnet_naming_symbols.property_symbols.applicable_accessibilities=* -dotnet_naming_symbols.property_symbols.applicable_kinds=property -dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected -dotnet_naming_symbols.public_fields_symbols.applicable_kinds=field -dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected -dotnet_naming_symbols.static_readonly_symbols.applicable_kinds=field -dotnet_naming_symbols.static_readonly_symbols.required_modifiers=static,readonly -dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities=* -dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds=namespace,class,struct,enum,delegate -dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities=* -dotnet_naming_symbols.type_parameters_symbols.applicable_kinds=type_parameter -dotnet_separate_import_directive_groups=false -dotnet_sort_system_directives_first=true -dotnet_style_parentheses_in_arithmetic_binary_operators= never_if_unnecessary:suggestion -dotnet_style_parentheses_in_other_binary_operators= never_if_unnecessary:suggestion -dotnet_style_parentheses_in_relational_binary_operators= never_if_unnecessary:suggestion -dotnet_style_predefined_type_for_locals_parameters_members= true:suggestion -dotnet_style_predefined_type_for_member_access= true:suggestion -dotnet_style_qualification_for_event= false:suggestion -dotnet_style_qualification_for_field= false:suggestion -dotnet_style_qualification_for_method= false:suggestion -dotnet_style_qualification_for_property= false:suggestion -dotnet_style_require_accessibility_modifiers= always:suggestion -file_header_template= - -# ReSharper properties -resharper_accessor_owner_body=expression_body -resharper_alignment_tab_fill_style=use_spaces -resharper_align_first_arg_by_paren=false -resharper_align_linq_query=false -resharper_align_multiline_argument=true -resharper_align_multiline_array_and_object_initializer=false -resharper_align_multiline_array_initializer=true -resharper_align_multiline_binary_expressions_chain=false -resharper_align_multiline_binary_patterns=false -resharper_align_multiline_ctor_init=true -resharper_align_multiline_expression_braces=false -resharper_align_multiline_implements_list=true -resharper_align_multiline_property_pattern=false -resharper_align_multiline_statement_conditions=true -resharper_align_multiline_switch_expression=false -resharper_align_multiline_type_argument=true -resharper_align_multiline_type_parameter=true -resharper_align_multline_type_parameter_constrains=true -resharper_align_multline_type_parameter_list=false -resharper_align_tuple_components=false -resharper_align_union_type_usage=true -resharper_allow_alias=true -resharper_allow_comment_after_lbrace=false -resharper_allow_far_alignment=false -resharper_always_use_end_of_line_brace_style=false -resharper_apply_auto_detected_rules=false -resharper_apply_on_completion=false -resharper_arguments_anonymous_function=positional -resharper_arguments_literal=positional -resharper_arguments_named=positional -resharper_arguments_other=positional -resharper_arguments_skip_single=false -resharper_arguments_string_literal=positional -resharper_attribute_style=do_not_touch -resharper_autodetect_indent_settings=false -resharper_blank_lines_after_block_statements=1 -resharper_blank_lines_after_case=0 -resharper_blank_lines_after_control_transfer_statements=1 -resharper_blank_lines_after_file_scoped_namespace_directive=1 -resharper_blank_lines_after_imports=1 -resharper_blank_lines_after_multiline_statements=0 -resharper_blank_lines_after_options=1 -resharper_blank_lines_after_start_comment=1 -resharper_blank_lines_after_using_list=1 -resharper_blank_lines_around_accessor=0 -resharper_blank_lines_around_auto_property=1 -resharper_blank_lines_around_block_case_section=0 -resharper_blank_lines_around_class_definition=1 -resharper_blank_lines_around_field=1 -resharper_blank_lines_around_function_declaration=0 -resharper_blank_lines_around_function_definition=1 -resharper_blank_lines_around_global_attribute=0 -resharper_blank_lines_around_invocable=1 -resharper_blank_lines_around_local_method=1 -resharper_blank_lines_around_multiline_case_section=0 -resharper_blank_lines_around_namespace=1 -resharper_blank_lines_around_other_declaration=0 -resharper_blank_lines_around_property=1 -resharper_blank_lines_around_razor_functions=1 -resharper_blank_lines_around_razor_helpers=1 -resharper_blank_lines_around_razor_sections=1 -resharper_blank_lines_around_region=1 -resharper_blank_lines_around_single_line_accessor=0 -resharper_blank_lines_around_single_line_auto_property=0 -resharper_blank_lines_around_single_line_field=0 -resharper_blank_lines_around_single_line_function_definition=0 -resharper_blank_lines_around_single_line_invocable=0 -resharper_blank_lines_around_single_line_local_method=0 -resharper_blank_lines_around_single_line_property=0 -resharper_blank_lines_around_single_line_type=0 -resharper_blank_lines_around_type=1 -resharper_blank_lines_before_block_statements=0 -resharper_blank_lines_before_case=0 -resharper_blank_lines_before_control_transfer_statements=0 -resharper_blank_lines_before_multiline_statements=0 -resharper_blank_lines_before_single_line_comment=0 -resharper_blank_lines_inside_namespace=0 -resharper_blank_lines_inside_region=1 -resharper_blank_lines_inside_type=0 -resharper_blank_line_after_pi=true -resharper_braces_for_dowhile=required -resharper_braces_for_fixed=required -resharper_braces_for_for=required_for_multiline -resharper_braces_for_foreach=required_for_multiline -resharper_braces_for_ifelse=not_required_for_both -resharper_braces_for_lock=required -resharper_braces_for_using=required -resharper_braces_for_while=required_for_multiline -resharper_braces_redundant=true -resharper_break_template_declaration=line_break -resharper_can_use_global_alias=true -resharper_configure_await_analysis_mode=disabled -resharper_constructor_or_destructor_body=expression_body -resharper_continuous_indent_multiplier=1 -resharper_continuous_line_indent=single -resharper_cpp_align_multiline_argument=true -resharper_cpp_align_multiline_calls_chain=true -resharper_cpp_align_multiline_extends_list=true -resharper_cpp_align_multiline_for_stmt=true -resharper_cpp_align_multiline_parameter=true -resharper_cpp_align_multiple_declaration=true -resharper_cpp_align_ternary=align_not_nested -resharper_cpp_anonymous_method_declaration_braces=next_line -resharper_cpp_case_block_braces=next_line_shifted_2 -resharper_cpp_empty_block_style=multiline -resharper_cpp_indent_switch_labels=false -resharper_cpp_insert_final_newline=false -resharper_cpp_int_align_comments=false -resharper_cpp_invocable_declaration_braces=next_line -resharper_cpp_max_line_length=120 -resharper_cpp_new_line_before_catch=true -resharper_cpp_new_line_before_else=true -resharper_cpp_new_line_before_while=true -resharper_cpp_other_braces=next_line -resharper_cpp_space_around_binary_operator=true -resharper_cpp_type_declaration_braces=next_line -resharper_cpp_wrap_arguments_style=wrap_if_long -resharper_cpp_wrap_lines=true -resharper_cpp_wrap_parameters_style=wrap_if_long -resharper_csharp_align_multiline_argument=false -resharper_csharp_align_multiline_calls_chain=false -resharper_csharp_align_multiline_expression=false -resharper_csharp_align_multiline_extends_list=false -resharper_csharp_align_multiline_for_stmt=false -resharper_csharp_align_multiline_parameter=false -resharper_csharp_align_multiple_declaration=true -resharper_csharp_empty_block_style=together -resharper_csharp_insert_final_newline=true -resharper_csharp_int_align_comments=true -resharper_csharp_max_line_length=144 -resharper_csharp_naming_rule.enum_member=AaBb -resharper_csharp_naming_rule.method_property_event=AaBb -resharper_csharp_naming_rule.other=AaBb -resharper_csharp_new_line_before_while=false -resharper_csharp_prefer_qualified_reference=false -resharper_csharp_space_after_unary_operator=false -resharper_csharp_wrap_arguments_style=wrap_if_long -resharper_csharp_wrap_before_binary_opsign=true -resharper_csharp_wrap_for_stmt_header_style=wrap_if_long -resharper_csharp_wrap_lines=true -resharper_csharp_wrap_parameters_style=wrap_if_long -resharper_css_brace_style=end_of_line -resharper_css_insert_final_newline=false -resharper_css_keep_blank_lines_between_declarations=1 -resharper_css_max_line_length=120 -resharper_css_wrap_lines=true -resharper_cxxcli_property_declaration_braces=next_line -resharper_declarations_style=separate_lines -resharper_default_exception_variable_name=e -resharper_default_value_when_type_evident=default_literal -resharper_default_value_when_type_not_evident=default_literal -resharper_delete_quotes_from_solid_values=false -resharper_disable_blank_line_changes=false -resharper_disable_formatter=false -resharper_disable_indenter=false -resharper_disable_int_align=false -resharper_disable_line_break_changes=false -resharper_disable_line_break_removal=false -resharper_disable_space_changes=false -resharper_disable_space_changes_before_trailing_comment=false -resharper_dont_remove_extra_blank_lines=false -resharper_enable_wrapping=false -resharper_enforce_line_ending_style=false -resharper_event_handler_pattern_long=$object$On$event$ -resharper_event_handler_pattern_short=On$event$ -resharper_expression_braces=inside -resharper_expression_pars=inside -resharper_extra_spaces=remove_all -resharper_force_attribute_style=separate -resharper_force_chop_compound_do_expression=false -resharper_force_chop_compound_if_expression=false -resharper_force_chop_compound_while_expression=false -resharper_force_control_statements_braces=do_not_change -resharper_force_linebreaks_inside_complex_literals=true -resharper_force_variable_declarations_on_new_line=false -resharper_format_leading_spaces_decl=false -resharper_free_block_braces=next_line -resharper_function_declaration_return_type_style=do_not_change -resharper_function_definition_return_type_style=do_not_change -resharper_generator_mode=false -resharper_html_attribute_indent=align_by_first_attribute -resharper_html_insert_final_newline=false -resharper_html_linebreak_before_elements=body,div,p,form,h1,h2,h3 -resharper_html_max_blank_lines_between_tags=2 -resharper_html_max_line_length=120 -resharper_html_pi_attribute_style=on_single_line -resharper_html_space_before_self_closing=false -resharper_html_wrap_lines=true -resharper_ignore_space_preservation=false -resharper_include_prefix_comment_in_indent=false -resharper_indent_access_specifiers_from_class=false -resharper_indent_aligned_ternary=true -resharper_indent_anonymous_method_block=false -resharper_indent_braces_inside_statement_conditions=true -resharper_indent_case_from_select=true -resharper_indent_child_elements=OneIndent -resharper_indent_class_members_from_access_specifiers=false -resharper_indent_comment=true -resharper_indent_inside_namespace=true -resharper_indent_invocation_pars=inside -resharper_indent_left_par_inside_expression=false -resharper_indent_method_decl_pars=inside -resharper_indent_nested_fixed_stmt=false -resharper_indent_nested_foreach_stmt=true -resharper_indent_nested_for_stmt=true -resharper_indent_nested_lock_stmt=false -resharper_indent_nested_usings_stmt=false -resharper_indent_nested_while_stmt=true -resharper_indent_pars=inside -resharper_indent_preprocessor_directives=none -resharper_indent_preprocessor_if=no_indent -resharper_indent_preprocessor_other=no_indent -resharper_indent_preprocessor_region=usual_indent -resharper_indent_statement_pars=inside -resharper_indent_text=OneIndent -resharper_indent_typearg_angles=inside -resharper_indent_typeparam_angles=inside -resharper_indent_type_constraints=true -resharper_indent_wrapped_function_names=false -resharper_instance_members_qualify_declared_in=this_class, base_class -resharper_int_align=true -resharper_int_align_assignments=true -resharper_int_align_binary_expressions=false -resharper_int_align_declaration_names=false -resharper_int_align_eq=false -resharper_int_align_fields=true -resharper_int_align_fix_in_adjacent=true -resharper_int_align_invocations=true -resharper_int_align_methods=true -resharper_int_align_nested_ternary=true -resharper_int_align_parameters=false -resharper_int_align_properties=true -resharper_int_align_property_patterns=true -resharper_int_align_switch_expressions=true -resharper_int_align_switch_sections=true -resharper_int_align_variables=true -resharper_js_align_multiline_parameter=false -resharper_js_align_multiple_declaration=false -resharper_js_align_ternary=none -resharper_js_brace_style=end_of_line -resharper_js_empty_block_style=multiline -resharper_js_indent_switch_labels=false -resharper_js_insert_final_newline=false -resharper_js_keep_blank_lines_between_declarations=2 -resharper_js_max_line_length=120 -resharper_js_new_line_before_catch=false -resharper_js_new_line_before_else=false -resharper_js_new_line_before_finally=false -resharper_js_new_line_before_while=false -resharper_js_space_around_binary_operator=true -resharper_js_wrap_arguments_style=chop_if_long -resharper_js_wrap_before_binary_opsign=false -resharper_js_wrap_for_stmt_header_style=chop_if_long -resharper_js_wrap_lines=true -resharper_js_wrap_parameters_style=chop_if_long -resharper_keep_blank_lines_in_code=2 -resharper_keep_blank_lines_in_declarations=2 -resharper_keep_existing_attribute_arrangement=false -resharper_keep_existing_declaration_block_arrangement=false -resharper_keep_existing_declaration_parens_arrangement=true -resharper_keep_existing_embedded_arrangement=false -resharper_keep_existing_embedded_block_arrangement=false -resharper_keep_existing_enum_arrangement=false -resharper_keep_existing_expr_member_arrangement=false -resharper_keep_existing_initializer_arrangement=false -resharper_keep_existing_invocation_parens_arrangement=true -resharper_keep_existing_property_patterns_arrangement=true -resharper_keep_existing_switch_expression_arrangement=false -resharper_keep_nontrivial_alias=true -resharper_keep_user_linebreaks=true -resharper_keep_user_wrapping=true -resharper_linebreaks_around_razor_statements=true -resharper_linebreaks_inside_tags_for_elements_longer_than=2147483647 -resharper_linebreaks_inside_tags_for_elements_with_child_elements=true -resharper_linebreaks_inside_tags_for_multiline_elements=true -resharper_linebreak_before_all_elements=false -resharper_linebreak_before_multiline_elements=true -resharper_linebreak_before_singleline_elements=false -resharper_line_break_after_colon_in_member_initializer_lists=do_not_change -resharper_line_break_after_comma_in_member_initializer_lists=false -resharper_line_break_before_comma_in_member_initializer_lists=false -resharper_line_break_before_requires_clause=do_not_change -resharper_linkage_specification_braces=end_of_line -resharper_linkage_specification_indentation=none -resharper_local_function_body=expression_body -resharper_macro_block_begin= -resharper_macro_block_end= -resharper_max_array_initializer_elements_on_line=10000 -resharper_max_attribute_length_for_same_line=38 -resharper_max_enum_members_on_line=1 -resharper_max_formal_parameters_on_line=10000 -resharper_max_initializer_elements_on_line=1 -resharper_max_invocation_arguments_on_line=10000 -resharper_media_query_style=same_line -resharper_member_initializer_list_style=do_not_change -resharper_method_or_operator_body=expression_body -resharper_min_blank_lines_after_imports=0 -resharper_min_blank_lines_around_fields=0 -resharper_min_blank_lines_around_functions=1 -resharper_min_blank_lines_around_types=1 -resharper_min_blank_lines_between_declarations=1 -resharper_namespace_declaration_braces=next_line -resharper_namespace_indentation=all -resharper_nested_ternary_style=autodetect -resharper_new_line_before_enumerators=true -resharper_normalize_tag_names=false -resharper_no_indent_inside_elements=html,body,thead,tbody,tfoot -resharper_no_indent_inside_if_element_longer_than=200 -resharper_object_creation_when_type_evident=target_typed -resharper_object_creation_when_type_not_evident=explicitly_typed -resharper_old_engine=false -resharper_options_braces_pointy=false -resharper_outdent_binary_ops=true -resharper_outdent_binary_pattern_ops=false -resharper_outdent_commas=false -resharper_outdent_dots=false -resharper_outdent_namespace_member=false -resharper_outdent_statement_labels=false -resharper_outdent_ternary_ops=false -resharper_parentheses_non_obvious_operations=none, bitwise, bitwise_inclusive_or, bitwise_exclusive_or, shift, bitwise_and -resharper_parentheses_redundancy_style=remove_if_not_clarifies_precedence -resharper_parentheses_same_type_operations=false -resharper_pi_attributes_indent=align_by_first_attribute -resharper_place_attribute_on_same_line=false -resharper_place_class_decorator_on_the_same_line=false -resharper_place_comments_at_first_column=false -resharper_place_constructor_initializer_on_same_line=false -resharper_place_each_decorator_on_new_line=false -resharper_place_event_attribute_on_same_line=false -resharper_place_expr_accessor_on_single_line=true -resharper_place_expr_method_on_single_line=false -resharper_place_expr_property_on_single_line=false -resharper_place_field_decorator_on_the_same_line=false -resharper_place_linq_into_on_new_line=true -resharper_place_method_decorator_on_the_same_line=false -resharper_place_namespace_definitions_on_same_line=false -resharper_place_property_attribute_on_same_line=false -resharper_place_property_decorator_on_the_same_line=false -resharper_place_simple_case_statement_on_same_line=if_owner_is_single_line -resharper_place_simple_embedded_statement_on_same_line=false -resharper_place_simple_enum_on_single_line=true -resharper_place_simple_initializer_on_single_line=true -resharper_place_simple_property_pattern_on_single_line=true -resharper_place_simple_switch_expression_on_single_line=true -resharper_place_template_args_on_new_line=false -resharper_place_type_constraints_on_same_line=true -resharper_prefer_explicit_discard_declaration=false -resharper_prefer_separate_deconstructed_variables_declaration=false -resharper_preserve_spaces_inside_tags=pre,textarea -resharper_properties_style=separate_lines_for_nonsingle -resharper_protobuf_brace_style=end_of_line -resharper_protobuf_empty_block_style=together_same_line -resharper_protobuf_insert_final_newline=false -resharper_protobuf_max_line_length=120 -resharper_protobuf_wrap_lines=true -resharper_qualified_using_at_nested_scope=false -resharper_quote_style=doublequoted -resharper_razor_prefer_qualified_reference=true -resharper_remove_blank_lines_near_braces=false -resharper_remove_blank_lines_near_braces_in_code=true -resharper_remove_blank_lines_near_braces_in_declarations=true -resharper_remove_this_qualifier=true -resharper_requires_expression_braces=next_line -resharper_resx_attribute_indent=single_indent -resharper_resx_insert_final_newline=false -resharper_resx_linebreak_before_elements= -resharper_resx_max_blank_lines_between_tags=0 -resharper_resx_max_line_length=2147483647 -resharper_resx_pi_attribute_style=do_not_touch -resharper_resx_space_before_self_closing=false -resharper_resx_wrap_lines=false -resharper_resx_wrap_tags_and_pi=false -resharper_resx_wrap_text=false -resharper_selector_style=same_line -resharper_show_autodetect_configure_formatting_tip=true -resharper_simple_blocks=do_not_change -resharper_simple_block_style=do_not_change -resharper_simple_case_statement_style=do_not_change -resharper_simple_embedded_statement_style=do_not_change -resharper_single_statement_function_style=do_not_change -resharper_sort_attributes=false -resharper_sort_class_selectors=false -resharper_sort_usings=true -resharper_sort_usings_lowercase_first=false -resharper_spaces_around_eq_in_attribute=false -resharper_spaces_around_eq_in_pi_attribute=false -resharper_spaces_inside_tags=false -resharper_space_after_arrow=true -resharper_space_after_attributes=true -resharper_space_after_attribute_target_colon=true -resharper_space_after_cast=false -resharper_space_after_colon=true -resharper_space_after_colon_in_case=true -resharper_space_after_colon_in_inheritance_clause=true -resharper_space_after_colon_in_type_annotation=true -resharper_space_after_comma=true -resharper_space_after_for_colon=true -resharper_space_after_function_comma=true -resharper_space_after_keywords_in_control_flow_statements=true -resharper_space_after_last_attribute=false -resharper_space_after_last_pi_attribute=false -resharper_space_after_media_colon=true -resharper_space_after_media_comma=true -resharper_space_after_operator_keyword=true -resharper_space_after_property_colon=true -resharper_space_after_property_semicolon=true -resharper_space_after_ptr_in_data_member=true -resharper_space_after_ptr_in_data_members=false -resharper_space_after_ptr_in_method=true -resharper_space_after_ref_in_data_member=true -resharper_space_after_ref_in_data_members=false -resharper_space_after_ref_in_method=true -resharper_space_after_selector_comma=true -resharper_space_after_semicolon_in_for_statement=true -resharper_space_after_separator=false -resharper_space_after_ternary_colon=true -resharper_space_after_ternary_quest=true -resharper_space_after_triple_slash=true -resharper_space_after_type_parameter_constraint_colon=true -resharper_space_around_additive_op=true -resharper_space_around_alias_eq=true -resharper_space_around_assignment_op=true -resharper_space_around_assignment_operator=true -resharper_space_around_attribute_match_operator=false -resharper_space_around_deref_in_trailing_return_type=true -resharper_space_around_lambda_arrow=true -resharper_space_around_member_access_operator=false -resharper_space_around_operator=true -resharper_space_around_pipe_or_amper_in_type_usage=true -resharper_space_around_relational_op=true -resharper_space_around_selector_operator=true -resharper_space_around_shift_op=true -resharper_space_around_stmt_colon=true -resharper_space_around_ternary_operator=true -resharper_space_before_array_rank_parentheses=false -resharper_space_before_arrow=true -resharper_space_before_attribute_target_colon=false -resharper_space_before_checked_parentheses=false -resharper_space_before_colon=false -resharper_space_before_colon_in_case=false -resharper_space_before_colon_in_inheritance_clause=true -resharper_space_before_colon_in_type_annotation=false -resharper_space_before_comma=false -resharper_space_before_default_parentheses=false -resharper_space_before_empty_invocation_parentheses=false -resharper_space_before_empty_method_parentheses=false -resharper_space_before_for_colon=true -resharper_space_before_function_comma=false -resharper_space_before_initializer_braces=false -resharper_space_before_invocation_parentheses=false -resharper_space_before_label_colon=false -resharper_space_before_lambda_parentheses=false -resharper_space_before_media_colon=false -resharper_space_before_media_comma=false -resharper_space_before_method_parentheses=false -resharper_space_before_nameof_parentheses=false -resharper_space_before_new_parentheses=false -resharper_space_before_nullable_mark=false -resharper_space_before_open_square_brackets=false -resharper_space_before_pointer_asterik_declaration=false -resharper_space_before_property_colon=false -resharper_space_before_property_semicolon=false -resharper_space_before_ptr_in_abstract_decl=false -resharper_space_before_ptr_in_data_member=false -resharper_space_before_ptr_in_data_members=true -resharper_space_before_ptr_in_method=false -resharper_space_before_ref_in_abstract_decl=false -resharper_space_before_ref_in_data_member=false -resharper_space_before_ref_in_data_members=true -resharper_space_before_ref_in_method=false -resharper_space_before_selector_comma=false -resharper_space_before_semicolon=false -resharper_space_before_semicolon_in_for_statement=false -resharper_space_before_separator=false -resharper_space_before_singleline_accessorholder=true -resharper_space_before_sizeof_parentheses=false -resharper_space_before_template_args=false -resharper_space_before_template_params=true -resharper_space_before_ternary_colon=true -resharper_space_before_ternary_quest=true -resharper_space_before_trailing_comment=true -resharper_space_before_typeof_parentheses=false -resharper_space_before_type_argument_angle=false -resharper_space_before_type_parameters_brackets=false -resharper_space_before_type_parameter_angle=false -resharper_space_before_type_parameter_constraint_colon=true -resharper_space_before_type_parameter_parentheses=true -resharper_space_between_accessors_in_singleline_property=true -resharper_space_between_attribute_sections=true -resharper_space_between_closing_angle_brackets_in_template_args=false -resharper_space_between_empty_square_brackets=false -resharper_space_between_keyword_and_expression=true -resharper_space_between_keyword_and_type=true -resharper_space_between_method_call_empty_parameter_list_parentheses=false -resharper_space_between_method_call_name_and_opening_parenthesis=false -resharper_space_between_method_call_parameter_list_parentheses=false -resharper_space_between_method_declaration_empty_parameter_list_parentheses=false -resharper_space_between_method_declaration_name_and_open_parenthesis=false -resharper_space_between_method_declaration_parameter_list_parentheses=false -resharper_space_between_parentheses_of_control_flow_statements=false -resharper_space_between_square_brackets=false -resharper_space_between_typecast_parentheses=false -resharper_space_colon_after=true -resharper_space_colon_before=false -resharper_space_comma=true -resharper_space_equals=true -resharper_space_inside_braces=true -resharper_space_in_singleline_accessorholder=true -resharper_space_in_singleline_anonymous_method=true -resharper_space_in_singleline_method=true -resharper_space_near_postfix_and_prefix_op=false -resharper_space_within_array_initialization_braces=false -resharper_space_within_array_rank_empty_parentheses=false -resharper_space_within_array_rank_parentheses=false -resharper_space_within_attribute_angles=false -resharper_space_within_attribute_match_brackets=false -resharper_space_within_checked_parentheses=false -resharper_space_within_default_parentheses=false -resharper_space_within_empty_braces=true -resharper_space_within_empty_initializer_braces=false -resharper_space_within_empty_invocation_parentheses=false -resharper_space_within_empty_method_parentheses=false -resharper_space_within_empty_object_literal_braces=false -resharper_space_within_empty_template_params=false -resharper_space_within_expression_parentheses=false -resharper_space_within_function_parentheses=false -resharper_space_within_import_braces=true -resharper_space_within_initializer_braces=false -resharper_space_within_invocation_parentheses=false -resharper_space_within_media_block=true -resharper_space_within_media_parentheses=false -resharper_space_within_method_parentheses=false -resharper_space_within_nameof_parentheses=false -resharper_space_within_new_parentheses=false -resharper_space_within_object_literal_braces=true -resharper_space_within_parentheses=false -resharper_space_within_property_block=true -resharper_space_within_single_line_array_initializer_braces=true -resharper_space_within_sizeof_parentheses=false -resharper_space_within_template_args=false -resharper_space_within_template_argument=false -resharper_space_within_template_params=false -resharper_space_within_tuple_parentheses=false -resharper_space_within_typeof_parentheses=false -resharper_space_within_type_argument_angles=false -resharper_space_within_type_parameters_brackets=false -resharper_space_within_type_parameter_angles=false -resharper_space_within_type_parameter_parentheses=false -resharper_special_else_if_treatment=true -resharper_static_members_qualify_members=none -resharper_static_members_qualify_with=declared_type -resharper_stick_comment=true -resharper_support_vs_event_naming_pattern=true -resharper_termination_style=ensure_semicolon -resharper_toplevel_function_declaration_return_type_style=do_not_change -resharper_toplevel_function_definition_return_type_style=do_not_change -resharper_trailing_comma_in_multiline_lists=true -resharper_trailing_comma_in_singleline_lists=false -resharper_types_braces=end_of_line -resharper_use_continuous_indent_inside_initializer_braces=true -resharper_use_continuous_indent_inside_parens=true -resharper_use_continuous_line_indent_in_expression_braces=false -resharper_use_continuous_line_indent_in_method_pars=false -resharper_use_heuristics_for_body_style=true -resharper_use_indents_from_main_language_in_file=true -resharper_use_indent_from_previous_element=true -resharper_use_indent_from_vs=false -resharper_use_roslyn_logic_for_evident_types=false -resharper_vb_align_multiline_argument=true -resharper_vb_align_multiline_expression=true -resharper_vb_align_multiline_parameter=true -resharper_vb_align_multiple_declaration=true -resharper_vb_insert_final_newline=false -resharper_vb_max_line_length=120 -resharper_vb_place_field_attribute_on_same_line=true -resharper_vb_place_method_attribute_on_same_line=false -resharper_vb_place_type_attribute_on_same_line=false -resharper_vb_prefer_qualified_reference=false -resharper_vb_space_after_unary_operator=true -resharper_vb_space_around_multiplicative_op=false -resharper_vb_wrap_arguments_style=wrap_if_long -resharper_vb_wrap_before_binary_opsign=false -resharper_vb_wrap_lines=true -resharper_vb_wrap_parameters_style=wrap_if_long -resharper_wrap_after_binary_opsign=true -resharper_wrap_after_declaration_lpar=false -resharper_wrap_after_dot=false -resharper_wrap_after_dot_in_method_calls=false -resharper_wrap_after_expression_lbrace=true -resharper_wrap_after_invocation_lpar=false -resharper_wrap_around_elements=true -resharper_wrap_array_initializer_style=chop_always -resharper_wrap_array_literals=chop_if_long -resharper_wrap_base_clause_style=wrap_if_long -resharper_wrap_before_arrow_with_expressions=true -resharper_wrap_before_binary_pattern_op=true -resharper_wrap_before_colon=false -resharper_wrap_before_comma=false -resharper_wrap_before_comma_in_base_clause=false -resharper_wrap_before_declaration_lpar=false -resharper_wrap_before_declaration_rpar=false -resharper_wrap_before_dot=true -resharper_wrap_before_eq=false -resharper_wrap_before_expression_rbrace=true -resharper_wrap_before_extends_colon=false -resharper_wrap_before_first_type_parameter_constraint=false -resharper_wrap_before_invocation_lpar=false -resharper_wrap_before_invocation_rpar=false -resharper_wrap_before_linq_expression=false -resharper_wrap_before_ternary_opsigns=true -resharper_wrap_before_type_parameter_langle=false -resharper_wrap_braced_init_list_style=wrap_if_long -resharper_wrap_chained_binary_expressions=chop_if_long -resharper_wrap_chained_binary_patterns=wrap_if_long -resharper_wrap_chained_method_calls=wrap_if_long -resharper_wrap_ctor_initializer_style=wrap_if_long -resharper_wrap_enumeration_style=chop_if_long -resharper_wrap_enum_declaration=chop_always -resharper_wrap_enum_style=do_not_change -resharper_wrap_extends_list_style=wrap_if_long -resharper_wrap_imports=chop_if_long -resharper_wrap_multiple_declaration_style=chop_if_long -resharper_wrap_multiple_type_parameter_constraints_style=chop_if_long -resharper_wrap_object_literals=chop_if_long -resharper_wrap_property_pattern=chop_if_long -resharper_wrap_switch_expression=chop_always -resharper_wrap_ternary_expr_style=chop_if_long -resharper_wrap_union_type_usage=chop_if_long -resharper_wrap_verbatim_interpolated_strings=no_wrap -resharper_xmldoc_attribute_indent=single_indent -resharper_xmldoc_insert_final_newline=false -resharper_xmldoc_linebreak_before_elements=summary,remarks,example,returns,param,typeparam,value,para -resharper_xmldoc_max_blank_lines_between_tags=0 -resharper_xmldoc_max_line_length=120 -resharper_xmldoc_pi_attribute_style=do_not_touch -resharper_xmldoc_space_before_self_closing=true -resharper_xmldoc_wrap_lines=true -resharper_xmldoc_wrap_tags_and_pi=true -resharper_xmldoc_wrap_text=true -resharper_xml_attribute_indent=align_by_first_attribute -resharper_xml_insert_final_newline=false -resharper_xml_linebreak_before_elements= -resharper_xml_max_blank_lines_between_tags=2 -resharper_xml_max_line_length=120 -resharper_xml_pi_attribute_style=do_not_touch -resharper_xml_space_before_self_closing=true -resharper_xml_wrap_lines=true -resharper_xml_wrap_tags_and_pi=true -resharper_xml_wrap_text=false - -# ReSharper inspection severities -resharper_abstract_class_constructor_can_be_made_protected_highlighting=hint -resharper_access_rights_in_text_highlighting=warning -resharper_access_to_disposed_closure_highlighting=warning -resharper_access_to_for_each_variable_in_closure_highlighting=warning -resharper_access_to_modified_closure_highlighting=warning -resharper_access_to_static_member_via_derived_type_highlighting=warning -resharper_address_of_marshal_by_ref_object_highlighting=warning -resharper_amd_dependency_path_problem_highlighting=none -resharper_amd_external_module_highlighting=suggestion -resharper_angular_html_banana_highlighting=warning -resharper_annotate_can_be_null_parameter_highlighting=none -resharper_annotate_can_be_null_type_member_highlighting=none -resharper_annotate_not_null_parameter_highlighting=none -resharper_annotate_not_null_type_member_highlighting=none -resharper_annotation_conflict_in_hierarchy_highlighting=warning -resharper_annotation_redundancy_at_value_type_highlighting=warning -resharper_annotation_redundancy_in_hierarchy_highlighting=warning -resharper_arguments_style_anonymous_function_highlighting=hint -resharper_arguments_style_literal_highlighting=hint -resharper_arguments_style_named_expression_highlighting=hint -resharper_arguments_style_other_highlighting=hint -resharper_arguments_style_string_literal_highlighting=hint -resharper_arrange_accessor_owner_body_highlighting=suggestion -resharper_arrange_attributes_highlighting=none -resharper_arrange_constructor_or_destructor_body_highlighting=hint -resharper_arrange_default_value_when_type_evident_highlighting=suggestion -resharper_arrange_default_value_when_type_not_evident_highlighting=hint -resharper_arrange_local_function_body_highlighting=hint -resharper_arrange_method_or_operator_body_highlighting=hint -resharper_arrange_missing_parentheses_highlighting=hint -resharper_arrange_namespace_body_highlighting=hint -resharper_arrange_object_creation_when_type_evident_highlighting=suggestion -resharper_arrange_object_creation_when_type_not_evident_highlighting=hint -resharper_arrange_redundant_parentheses_highlighting=hint -resharper_arrange_static_member_qualifier_highlighting=hint -resharper_arrange_this_qualifier_highlighting=hint -resharper_arrange_trailing_comma_in_multiline_lists_highlighting=hint -resharper_arrange_trailing_comma_in_singleline_lists_highlighting=hint -resharper_arrange_type_member_modifiers_highlighting=hint -resharper_arrange_type_modifiers_highlighting=hint -resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting=suggestion -resharper_asp_content_placeholder_not_resolved_highlighting=error -resharper_asp_custom_page_parser_filter_type_highlighting=warning -resharper_asp_dead_code_highlighting=warning -resharper_asp_entity_highlighting=warning -resharper_asp_image_highlighting=warning -resharper_asp_invalid_control_type_highlighting=error -resharper_asp_not_resolved_highlighting=error -resharper_asp_ods_method_reference_resolve_error_highlighting=error -resharper_asp_resolve_warning_highlighting=warning -resharper_asp_skin_not_resolved_highlighting=error -resharper_asp_tag_attribute_with_optional_value_highlighting=warning -resharper_asp_theme_not_resolved_highlighting=error -resharper_asp_unused_register_directive_highlighting_highlighting=warning -resharper_asp_warning_highlighting=warning -resharper_assigned_value_is_never_used_highlighting=warning -resharper_assigned_value_wont_be_assigned_to_corresponding_field_highlighting=warning -resharper_assignment_in_conditional_expression_highlighting=warning -resharper_assignment_in_condition_expression_highlighting=warning -resharper_assignment_is_fully_discarded_highlighting=warning -resharper_assign_null_to_not_null_attribute_highlighting=warning -resharper_assign_to_constant_highlighting=error -resharper_assign_to_implicit_global_in_function_scope_highlighting=warning -resharper_asxx_path_error_highlighting=warning -resharper_async_iterator_invocation_without_await_foreach_highlighting=warning -resharper_async_void_lambda_highlighting=warning -resharper_async_void_method_highlighting=none -resharper_auto_property_can_be_made_get_only_global_highlighting=suggestion -resharper_auto_property_can_be_made_get_only_local_highlighting=suggestion -resharper_bad_attribute_brackets_spaces_highlighting=none -resharper_bad_braces_spaces_highlighting=none -resharper_bad_child_statement_indent_highlighting=warning -resharper_bad_colon_spaces_highlighting=none -resharper_bad_comma_spaces_highlighting=none -resharper_bad_control_braces_indent_highlighting=suggestion -resharper_bad_control_braces_line_breaks_highlighting=none -resharper_bad_declaration_braces_indent_highlighting=none -resharper_bad_declaration_braces_line_breaks_highlighting=none -resharper_bad_empty_braces_line_breaks_highlighting=none -resharper_bad_expression_braces_indent_highlighting=none -resharper_bad_expression_braces_line_breaks_highlighting=none -resharper_bad_generic_brackets_spaces_highlighting=none -resharper_bad_indent_highlighting=none -resharper_bad_linq_line_breaks_highlighting=none -resharper_bad_list_line_breaks_highlighting=none -resharper_bad_member_access_spaces_highlighting=none -resharper_bad_namespace_braces_indent_highlighting=none -resharper_bad_parens_line_breaks_highlighting=none -resharper_bad_parens_spaces_highlighting=none -resharper_bad_preprocessor_indent_highlighting=none -resharper_bad_semicolon_spaces_highlighting=none -resharper_bad_spaces_after_keyword_highlighting=none -resharper_bad_square_brackets_spaces_highlighting=none -resharper_bad_switch_braces_indent_highlighting=none -resharper_bad_symbol_spaces_highlighting=none -resharper_base_member_has_params_highlighting=warning -resharper_base_method_call_with_default_parameter_highlighting=warning -resharper_base_object_equals_is_object_equals_highlighting=warning -resharper_base_object_get_hash_code_call_in_get_hash_code_highlighting=warning -resharper_bitwise_operator_on_enum_without_flags_highlighting=warning -resharper_block_scope_redeclaration_highlighting=error -resharper_built_in_type_reference_style_for_member_access_highlighting=hint -resharper_built_in_type_reference_style_highlighting=hint -resharper_by_ref_argument_is_volatile_field_highlighting=warning -resharper_caller_callee_using_error_highlighting=error -resharper_caller_callee_using_highlighting=warning -resharper_cannot_apply_equality_operator_to_type_highlighting=warning -resharper_center_tag_is_obsolete_highlighting=warning -resharper_check_for_reference_equality_instead_1_highlighting=suggestion -resharper_check_for_reference_equality_instead_2_highlighting=suggestion -resharper_check_for_reference_equality_instead_3_highlighting=suggestion -resharper_check_for_reference_equality_instead_4_highlighting=suggestion -resharper_check_namespace_highlighting=warning -resharper_class_cannot_be_instantiated_highlighting=warning -resharper_class_can_be_sealed_global_highlighting=none -resharper_class_can_be_sealed_local_highlighting=none -resharper_class_highlighting=suggestion -resharper_class_never_instantiated_global_highlighting=suggestion -resharper_class_never_instantiated_local_highlighting=suggestion -resharper_class_with_virtual_members_never_inherited_global_highlighting=suggestion -resharper_class_with_virtual_members_never_inherited_local_highlighting=suggestion -resharper_clear_attribute_is_obsolete_all_highlighting=warning -resharper_clear_attribute_is_obsolete_highlighting=warning -resharper_closure_on_modified_variable_highlighting=warning -resharper_coerced_equals_using_highlighting=warning -resharper_coerced_equals_using_with_null_undefined_highlighting=none -resharper_collection_never_queried_global_highlighting=warning -resharper_collection_never_queried_local_highlighting=warning -resharper_collection_never_updated_global_highlighting=warning -resharper_collection_never_updated_local_highlighting=warning -resharper_comma_not_valid_here_highlighting=error -resharper_comment_typo_highlighting=suggestion -resharper_common_js_external_module_highlighting=suggestion -resharper_compare_non_constrained_generic_with_null_highlighting=none -resharper_compare_of_floats_by_equality_operator_highlighting=none -resharper_conditional_ternary_equal_branch_highlighting=warning -resharper_condition_is_always_const_highlighting=warning -resharper_condition_is_always_true_or_false_highlighting=warning -resharper_confusing_char_as_integer_in_constructor_highlighting=warning -resharper_constant_conditional_access_qualifier_highlighting=warning -resharper_constant_null_coalescing_condition_highlighting=warning -resharper_constructor_call_not_used_highlighting=warning -resharper_constructor_initializer_loop_highlighting=warning -resharper_container_annotation_redundancy_highlighting=warning -resharper_context_value_is_provided_highlighting=none -resharper_contract_annotation_not_parsed_highlighting=warning -resharper_convert_closure_to_method_group_highlighting=suggestion -resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting=hint -resharper_convert_if_do_to_while_highlighting=suggestion -resharper_convert_if_statement_to_conditional_ternary_expression_highlighting=suggestion -resharper_convert_if_statement_to_null_coalescing_assignment_highlighting=suggestion -resharper_convert_if_statement_to_null_coalescing_expression_highlighting=suggestion -resharper_convert_if_statement_to_return_statement_highlighting=hint -resharper_convert_if_statement_to_switch_expression_highlighting=hint -resharper_convert_if_statement_to_switch_statement_highlighting=hint -resharper_convert_if_to_or_expression_highlighting=suggestion -resharper_convert_nullable_to_short_form_highlighting=suggestion -resharper_convert_switch_statement_to_switch_expression_highlighting=hint -resharper_convert_to_auto_property_highlighting=suggestion -resharper_convert_to_auto_property_when_possible_highlighting=hint -resharper_convert_to_auto_property_with_private_setter_highlighting=hint -resharper_convert_to_compound_assignment_highlighting=hint -resharper_convert_to_constant_global_highlighting=hint -resharper_convert_to_constant_local_highlighting=hint -resharper_convert_to_lambda_expression_highlighting=suggestion -resharper_convert_to_lambda_expression_when_possible_highlighting=none -resharper_convert_to_local_function_highlighting=suggestion -resharper_convert_to_null_coalescing_compound_assignment_highlighting=suggestion -resharper_convert_to_primary_constructor_highlighting=suggestion -resharper_convert_to_static_class_highlighting=suggestion -resharper_convert_to_using_declaration_highlighting=suggestion -resharper_convert_to_vb_auto_property_highlighting=suggestion -resharper_convert_to_vb_auto_property_when_possible_highlighting=hint -resharper_convert_to_vb_auto_property_with_private_setter_highlighting=hint -resharper_convert_type_check_pattern_to_null_check_highlighting=warning -resharper_convert_type_check_to_null_check_highlighting=warning -resharper_co_variant_array_conversion_highlighting=warning -resharper_cpp_abstract_class_without_specifier_highlighting=warning -resharper_cpp_abstract_final_class_highlighting=warning -resharper_cpp_abstract_virtual_function_call_in_ctor_highlighting=error -resharper_cpp_access_specifier_with_no_declarations_highlighting=suggestion -resharper_cpp_assigned_value_is_never_used_highlighting=warning -resharper_cpp_awaiter_type_is_not_class_highlighting=warning -resharper_cpp_bad_angle_brackets_spaces_highlighting=none -resharper_cpp_bad_braces_spaces_highlighting=none -resharper_cpp_bad_child_statement_indent_highlighting=none -resharper_cpp_bad_colon_spaces_highlighting=none -resharper_cpp_bad_comma_spaces_highlighting=none -resharper_cpp_bad_control_braces_indent_highlighting=none -resharper_cpp_bad_control_braces_line_breaks_highlighting=none -resharper_cpp_bad_declaration_braces_indent_highlighting=none -resharper_cpp_bad_declaration_braces_line_breaks_highlighting=none -resharper_cpp_bad_empty_braces_line_breaks_highlighting=none -resharper_cpp_bad_expression_braces_indent_highlighting=none -resharper_cpp_bad_expression_braces_line_breaks_highlighting=none -resharper_cpp_bad_indent_highlighting=none -resharper_cpp_bad_list_line_breaks_highlighting=none -resharper_cpp_bad_member_access_spaces_highlighting=none -resharper_cpp_bad_namespace_braces_indent_highlighting=none -resharper_cpp_bad_parens_line_breaks_highlighting=none -resharper_cpp_bad_parens_spaces_highlighting=none -resharper_cpp_bad_semicolon_spaces_highlighting=none -resharper_cpp_bad_spaces_after_keyword_highlighting=none -resharper_cpp_bad_square_brackets_spaces_highlighting=none -resharper_cpp_bad_switch_braces_indent_highlighting=none -resharper_cpp_bad_symbol_spaces_highlighting=none -resharper_cpp_boolean_increment_expression_highlighting=warning -resharper_cpp_boost_format_bad_code_highlighting=warning -resharper_cpp_boost_format_legacy_code_highlighting=suggestion -resharper_cpp_boost_format_mixed_args_highlighting=error -resharper_cpp_boost_format_too_few_args_highlighting=error -resharper_cpp_boost_format_too_many_args_highlighting=warning -resharper_cpp_clang_tidy_abseil_duration_addition_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_comparison_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_conversion_cast_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_division_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_factory_float_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_factory_scale_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_subtraction_highlighting=none -resharper_cpp_clang_tidy_abseil_duration_unnecessary_conversion_highlighting=none -resharper_cpp_clang_tidy_abseil_faster_strsplit_delimiter_highlighting=none -resharper_cpp_clang_tidy_abseil_no_internal_dependencies_highlighting=none -resharper_cpp_clang_tidy_abseil_no_namespace_highlighting=none -resharper_cpp_clang_tidy_abseil_redundant_strcat_calls_highlighting=none -resharper_cpp_clang_tidy_abseil_string_find_startswith_highlighting=none -resharper_cpp_clang_tidy_abseil_string_find_str_contains_highlighting=none -resharper_cpp_clang_tidy_abseil_str_cat_append_highlighting=none -resharper_cpp_clang_tidy_abseil_time_comparison_highlighting=none -resharper_cpp_clang_tidy_abseil_time_subtraction_highlighting=none -resharper_cpp_clang_tidy_abseil_upgrade_duration_conversions_highlighting=none -resharper_cpp_clang_tidy_altera_id_dependent_backward_branch_highlighting=none -resharper_cpp_clang_tidy_altera_kernel_name_restriction_highlighting=none -resharper_cpp_clang_tidy_altera_single_work_item_barrier_highlighting=none -resharper_cpp_clang_tidy_altera_struct_pack_align_highlighting=none -resharper_cpp_clang_tidy_altera_unroll_loops_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_accept4_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_accept_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_creat_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_dup_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_epoll_create1_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_epoll_create_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_fopen_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_inotify_init1_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_inotify_init_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_memfd_create_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_open_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_pipe2_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_pipe_highlighting=none -resharper_cpp_clang_tidy_android_cloexec_socket_highlighting=none -resharper_cpp_clang_tidy_android_comparison_in_temp_failure_retry_highlighting=none -resharper_cpp_clang_tidy_boost_use_to_string_highlighting=suggestion -resharper_cpp_clang_tidy_bugprone_argument_comment_highlighting=suggestion -resharper_cpp_clang_tidy_bugprone_assert_side_effect_highlighting=warning -resharper_cpp_clang_tidy_bugprone_bad_signal_to_kill_thread_highlighting=warning -resharper_cpp_clang_tidy_bugprone_bool_pointer_implicit_conversion_highlighting=none -resharper_cpp_clang_tidy_bugprone_branch_clone_highlighting=warning -resharper_cpp_clang_tidy_bugprone_copy_constructor_init_highlighting=warning -resharper_cpp_clang_tidy_bugprone_dangling_handle_highlighting=warning -resharper_cpp_clang_tidy_bugprone_dynamic_static_initializers_highlighting=warning -resharper_cpp_clang_tidy_bugprone_easily_swappable_parameters_highlighting=none -resharper_cpp_clang_tidy_bugprone_exception_escape_highlighting=none -resharper_cpp_clang_tidy_bugprone_fold_init_type_highlighting=warning -resharper_cpp_clang_tidy_bugprone_forwarding_reference_overload_highlighting=warning -resharper_cpp_clang_tidy_bugprone_forward_declaration_namespace_highlighting=warning -resharper_cpp_clang_tidy_bugprone_implicit_widening_of_multiplication_result_highlighting=warning -resharper_cpp_clang_tidy_bugprone_inaccurate_erase_highlighting=warning -resharper_cpp_clang_tidy_bugprone_incorrect_roundings_highlighting=warning -resharper_cpp_clang_tidy_bugprone_infinite_loop_highlighting=warning -resharper_cpp_clang_tidy_bugprone_integer_division_highlighting=warning -resharper_cpp_clang_tidy_bugprone_lambda_function_name_highlighting=warning -resharper_cpp_clang_tidy_bugprone_macro_parentheses_highlighting=warning -resharper_cpp_clang_tidy_bugprone_macro_repeated_side_effects_highlighting=warning -resharper_cpp_clang_tidy_bugprone_misplaced_operator_in_strlen_in_alloc_highlighting=warning -resharper_cpp_clang_tidy_bugprone_misplaced_pointer_arithmetic_in_alloc_highlighting=warning -resharper_cpp_clang_tidy_bugprone_misplaced_widening_cast_highlighting=warning -resharper_cpp_clang_tidy_bugprone_move_forwarding_reference_highlighting=warning -resharper_cpp_clang_tidy_bugprone_multiple_statement_macro_highlighting=warning -resharper_cpp_clang_tidy_bugprone_narrowing_conversions_highlighting=warning -resharper_cpp_clang_tidy_bugprone_not_null_terminated_result_highlighting=warning -resharper_cpp_clang_tidy_bugprone_no_escape_highlighting=warning -resharper_cpp_clang_tidy_bugprone_parent_virtual_call_highlighting=warning -resharper_cpp_clang_tidy_bugprone_posix_return_highlighting=warning -resharper_cpp_clang_tidy_bugprone_redundant_branch_condition_highlighting=warning -resharper_cpp_clang_tidy_bugprone_reserved_identifier_highlighting=warning -resharper_cpp_clang_tidy_bugprone_signal_handler_highlighting=warning -resharper_cpp_clang_tidy_bugprone_signed_char_misuse_highlighting=warning -resharper_cpp_clang_tidy_bugprone_sizeof_container_highlighting=warning -resharper_cpp_clang_tidy_bugprone_sizeof_expression_highlighting=warning -resharper_cpp_clang_tidy_bugprone_spuriously_wake_up_functions_highlighting=warning -resharper_cpp_clang_tidy_bugprone_string_constructor_highlighting=warning -resharper_cpp_clang_tidy_bugprone_string_integer_assignment_highlighting=warning -resharper_cpp_clang_tidy_bugprone_string_literal_with_embedded_nul_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_enum_usage_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_include_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_memset_usage_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_missing_comma_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_semicolon_highlighting=warning -resharper_cpp_clang_tidy_bugprone_suspicious_string_compare_highlighting=warning -resharper_cpp_clang_tidy_bugprone_swapped_arguments_highlighting=warning -resharper_cpp_clang_tidy_bugprone_terminating_continue_highlighting=warning -resharper_cpp_clang_tidy_bugprone_throw_keyword_missing_highlighting=warning -resharper_cpp_clang_tidy_bugprone_too_small_loop_variable_highlighting=warning -resharper_cpp_clang_tidy_bugprone_undefined_memory_manipulation_highlighting=warning -resharper_cpp_clang_tidy_bugprone_undelegated_constructor_highlighting=warning -resharper_cpp_clang_tidy_bugprone_unhandled_exception_at_new_highlighting=none -resharper_cpp_clang_tidy_bugprone_unhandled_self_assignment_highlighting=warning -resharper_cpp_clang_tidy_bugprone_unused_raii_highlighting=warning -resharper_cpp_clang_tidy_bugprone_unused_return_value_highlighting=warning -resharper_cpp_clang_tidy_bugprone_use_after_move_highlighting=warning -resharper_cpp_clang_tidy_bugprone_virtual_near_miss_highlighting=suggestion -resharper_cpp_clang_tidy_cert_con36_c_highlighting=none -resharper_cpp_clang_tidy_cert_con54_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_dcl03_c_highlighting=none -resharper_cpp_clang_tidy_cert_dcl16_c_highlighting=none -resharper_cpp_clang_tidy_cert_dcl21_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_dcl37_c_highlighting=none -resharper_cpp_clang_tidy_cert_dcl50_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_dcl51_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_dcl54_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_dcl58_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_dcl59_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_env33_c_highlighting=none -resharper_cpp_clang_tidy_cert_err09_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_err34_c_highlighting=suggestion -resharper_cpp_clang_tidy_cert_err52_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_err58_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_err60_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_err61_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_fio38_c_highlighting=none -resharper_cpp_clang_tidy_cert_flp30_c_highlighting=warning -resharper_cpp_clang_tidy_cert_mem57_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_msc30_c_highlighting=none -resharper_cpp_clang_tidy_cert_msc32_c_highlighting=none -resharper_cpp_clang_tidy_cert_msc50_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_msc51_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_oop11_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_oop54_cpp_highlighting=none -resharper_cpp_clang_tidy_cert_oop57_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_oop58_cpp_highlighting=warning -resharper_cpp_clang_tidy_cert_pos44_c_highlighting=none -resharper_cpp_clang_tidy_cert_pos47_c_highlighting=none -resharper_cpp_clang_tidy_cert_sig30_c_highlighting=none -resharper_cpp_clang_tidy_cert_str34_c_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_api_modeling_google_g_test_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_cast_value_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_return_value_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_api_modeling_std_c_library_functions_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_nonnull_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_builtin_builtin_functions_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_builtin_no_return_functions_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_modeling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_divide_zero_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_dynamic_type_propagation_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_nonnil_string_constants_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_non_null_param_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_null_dereference_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_stack_address_escape_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_stack_addr_escape_base_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_undefined_binary_operator_result_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_array_subscript_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_assign_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_branch_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_captured_block_variable_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_undef_return_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_core_vla_size_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_inner_pointer_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_move_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_leaks_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_placement_new_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_pure_virtual_call_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_self_assignment_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_smart_ptr_modeling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_cplusplus_virtual_call_modeling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_deadcode_dead_stores_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_fuchsia_handle_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_nullability_base_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_dereferenced_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_passed_to_nonnull_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_returned_from_nonnull_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_null_passed_to_nonnull_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_nullability_null_returned_from_nonnull_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_uninitialized_object_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_virtual_call_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_mpi_mpi_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_empty_localization_context_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_non_localized_string_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_osx_os_object_c_style_cast_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_performance_gcd_antipattern_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_performance_padding_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_optin_portability_unix_api_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_api_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_at_sync_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_autorelease_write_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_class_release_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_dealloc_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_incompatible_method_types_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_loops_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_missing_super_call_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_nil_arg_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_non_nil_return_value_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_autorelease_pool_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_error_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_obj_c_generics_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_base_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_run_loop_autorelease_leak_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_self_init_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_super_dealloc_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_unused_ivars_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_variadic_method_types_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_error_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_number_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_retain_release_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_out_of_bounds_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_pointer_sized_values_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_mig_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_ns_or_cf_error_deref_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_number_object_conversion_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_obj_c_property_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_os_object_retain_count_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_osx_sec_keychain_api_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_float_loop_counter_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcmp_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcopy_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bzero_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_decode_value_of_obj_c_type_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_deprecated_or_unsafe_buffer_handling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_getpw_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_gets_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mkstemp_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mktemp_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_rand_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_security_syntax_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_strcpy_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_unchecked_return_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_vfork_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_api_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_bad_size_arg_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_c_string_modeling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_null_arg_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_dynamic_memory_modeling_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_sizeof_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_mismatched_deallocator_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_unix_vfork_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_valist_copy_to_self_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_valist_uninitialized_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_valist_unterminated_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_valist_valist_base_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_webkit_no_uncounted_member_checker_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_webkit_ref_cntbl_base_virtual_dtor_highlighting=none -resharper_cpp_clang_tidy_clang_analyzer_webkit_uncounted_lambda_captures_checker_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_absolute_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_abstract_final_class_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_abstract_vbase_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_address_of_packed_member_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_address_of_temporary_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_aix_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_align_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_alloca_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_alloca_with_align_alignof_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_delete_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_ellipsis_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_macro_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_member_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_reversed_operator_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_analyzer_incompatible_plugin_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_anonymous_pack_parens_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_anon_enum_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_bridge_casts_disallowed_in_nonarc_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_maybe_repeated_use_of_weak_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_non_pod_memaccess_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_perform_selector_leaks_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_repeated_use_of_weak_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_retain_cycles_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_arc_unsafe_retained_assign_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_argument_outside_range_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_pointer_arithmetic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_asm_operand_widths_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_assign_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_assume_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_atimport_in_framework_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_atomic_alignment_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_atomic_implicit_seq_cst_highlighting=suggestion -resharper_cpp_clang_tidy_clang_diagnostic_atomic_memory_ordering_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_atomic_property_with_user_defined_accessor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_attribute_packed_for_bitfield_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_at_protocol_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_auto_disable_vptr_sanitizer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_auto_import_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_auto_storage_class_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_auto_var_id_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_availability_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_avr_rtlib_linking_quirks_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_backslash_newline_escape_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bad_function_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_binding_in_condition_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bind_to_temporary_copy_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bitfield_constant_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bitfield_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bitfield_width_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bitwise_conditional_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bitwise_op_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_block_capture_autoreleasing_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bool_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bool_operation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_braced_scalar_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_bridge_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_builtin_assume_aligned_alignment_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_builtin_macro_redefined_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_builtin_memcpy_chk_size_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_builtin_requires_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_c11_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_c2x_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_c99_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_c99_designator_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_c99_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_called_once_parameter_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_call_to_pure_virtual_from_ctor_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_align_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_calling_convention_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_of_sel_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_unrelated_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cf_string_literal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_char_subscripts_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_clang_cl_pch_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_class_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_class_varargs_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cmse_union_leak_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_comma_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_comment_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_compare_distinct_pointer_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_completion_handler_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_complex_component_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_macro_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_space_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_concepts_ts_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_conditional_type_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_conditional_uninitialized_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_config_macros_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_constant_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_constant_evaluated_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_constant_logical_operand_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_constexpr_not_const_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_consumed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_coroutine_missing_unhandled_exception_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_covered_switch_default_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_deprecated_writable_strings_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_reserved_user_defined_literal_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extra_semi_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_inline_namespace_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_long_long_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp14_binary_literal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp14_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_mangling_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp17_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp20_designator_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp20_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp2b_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_bind_to_temporary_copy_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_extra_semi_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_local_type_template_args_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_unnamed_type_template_args_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_binary_literal_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cpp_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cstring_format_directive_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ctad_maybe_unsupported_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_ctu_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_cuda_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_custom_atomic_properties_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_cxx_attribute_extension_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dangling_else_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dangling_field_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dangling_gsl_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dangling_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dangling_initializer_list_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_darwin_sdk_settings_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_date_time_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dealloc_in_category_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_debug_compression_unavailable_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_declaration_after_statement_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_defaulted_function_deleted_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_delegating_ctor_cycles_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_delete_abstract_non_virtual_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_delete_incomplete_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_delete_non_abstract_non_virtual_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_delete_non_virtual_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_altivec_src_compat_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_anon_enum_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_array_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_attributes_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_comma_subscript_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_copy_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_dynamic_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_conditional_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_implementations_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_increment_bool_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_isa_usage_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_perform_selector_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_register_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_this_capture_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_deprecated_volatile_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_direct_ivar_access_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_disabled_macro_expansion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_distributed_object_modifiers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_division_by_zero_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dllexport_explicit_instantiation_decl_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dllimport_static_field_def_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dll_attribute_on_redeclaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_documentation_deprecated_sync_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_documentation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_documentation_html_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_documentation_pedantic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_documentation_unknown_command_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_dollar_in_identifier_extension_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_double_promotion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dtor_name_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dtor_typedef_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_duplicate_decl_specifier_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_duplicate_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_arg_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_match_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_duplicate_protocol_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dynamic_class_memaccess_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_dynamic_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_embedded_directive_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_empty_body_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_empty_decomposition_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_empty_init_stmt_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_empty_translation_unit_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_encode_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_conditional_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_switch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_enum_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_enum_too_large_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_error_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_exceptions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_excess_initializers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_exit_time_destructors_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_expansion_to_defined_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_explicit_initialize_call_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_explicit_ownership_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_export_unnamed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_export_using_directive_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_extern_c_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_extern_initializer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_extra_qualification_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_stmt_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_extra_tokens_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_final_dtor_non_final_class_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_fixed_enum_extension_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_fixed_point_overflow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_flag_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_flexible_array_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_float_equal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_float_overflow_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_float_zero_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_extra_args_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_insufficient_args_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_invalid_specifier_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_nonliteral_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_non_iso_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_pedantic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_security_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_type_confusion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_format_zero_length_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_fortify_source_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_for_loop_analysis_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_four_char_constants_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_framework_include_private_from_public_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_frame_address_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_frame_larger_than_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_free_nonheap_object_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_function_def_in_objc_container_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_function_multiversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gcc_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_global_constructors_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_global_isel_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_alignof_expression_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_anonymous_struct_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_gnu_array_member_paren_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_auto_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_binary_literal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_case_range_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_complex_integer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_compound_literal_initializer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_conditional_omitted_operand_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_designator_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_initializer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_struct_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_initializer_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_union_member_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_folding_constant_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_imaginary_constant_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_include_next_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_inline_cpp_without_extern_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_label_as_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_redeclared_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_static_float_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_string_literal_operator_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_union_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_variable_sized_type_not_at_end_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_gnu_zero_variadic_macro_arguments_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_header_guard_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_header_hygiene_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_hip_only_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_idiomatic_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ignored_attributes_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_ignored_availability_without_sdk_settings_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_ignored_optimization_argument_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragmas_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_intrinsic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_optimize_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_ignored_qualifiers_highlighting=suggestion -resharper_cpp_clang_tidy_clang_diagnostic_implicitly_unsigned_literal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_atomic_properties_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_const_int_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_conversion_floating_point_to_bool_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_exception_spec_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_per_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_fixed_point_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_function_declaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_float_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_implicit_retain_self_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_import_preprocessor_directive_pedantic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inaccessible_base_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_include_next_absolute_path_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_include_next_outside_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_library_redeclaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_struct_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_discards_qualifiers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_property_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incompatible_sysroot_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incomplete_framework_module_declaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incomplete_implementation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incomplete_module_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incomplete_setjmp_declaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_incomplete_umbrella_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_dllimport_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_destructor_override_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_override_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_increment_bool_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_independent_class_attribute_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_infinite_recursion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_initializer_overrides_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_injected_class_name_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inline_asm_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inline_namespace_reopened_noninline_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_inline_new_delete_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_instantiation_after_specialization_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_integer_overflow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_interrupt_service_routine_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_int_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_int_in_bool_context_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_int_to_pointer_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_int_to_void_pointer_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_constexpr_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_iboutlet_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_initializer_from_system_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_ios_deployment_target_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_noreturn_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_no_builtin_names_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_offsetof_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_or_nonexistent_directory_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_partial_specialization_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_pp_token_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_source_encoding_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_invalid_token_paste_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_jump_seh_finally_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_keyword_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_keyword_macro_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_knr_promoted_parameter_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_language_extension_token_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_large_by_value_copy_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_literal_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_literal_range_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_local_type_template_args_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_logical_not_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_logical_op_parentheses_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_long_long_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_macro_redefined_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_main_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_main_return_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_malformed_warning_check_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_many_braces_around_scalar_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_max_tokens_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_max_unsigned_zero_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_memset_transposed_args_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_memsize_comparison_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_method_signatures_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_abstract_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_anon_tag_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_charize_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_comment_paste_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_const_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cpp_macro_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_default_arg_redefinition_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_drectve_section_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_end_of_file_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_forward_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exists_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_explicit_constructor_call_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_extra_qualification_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_fixed_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_flexible_array_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_goto_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inaccessible_base_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_include_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_mutable_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_pure_definition_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_redeclare_static_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_sealed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_static_assert_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_shadow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_union_member_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_unqualified_friend_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_using_decl_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_microsoft_void_pseudo_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_misleading_indentation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_mismatched_new_delete_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_mismatched_parameter_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_mismatched_return_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_mismatched_tags_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_braces_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_constinit_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_declarations_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_field_initializers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_method_return_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_noescape_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_noreturn_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_prototypes_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_missing_prototype_for_cc_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_selector_name_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_sysroot_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_missing_variable_declarations_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_misspelled_assumption_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_modules_ambiguous_internal_linkage_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_modules_import_nested_redundant_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_module_conflict_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_module_file_config_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_module_file_extension_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_module_import_in_extern_c_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_multiple_move_vbase_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nested_anon_types_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_newline_eof_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_new_returns_null_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_noderef_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nonnull_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nonportable_include_path_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nonportable_system_include_path_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nonportable_vector_initialization_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memaccess_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_c_typedef_for_linkage_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_literal_null_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_framework_module_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_module_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_pod_varargs_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_power_of_two_alignment_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_non_virtual_dtor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nsconsumed_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nsreturns_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ns_object_attribute_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_on_arrays_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_declspec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_extension_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullability_inferred_on_nested_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_nullable_to_nonnull_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_arithmetic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_character_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_dereference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_arithmetic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_subtraction_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_odr_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_opencl_unsupported_rgba_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_openmp51_extensions_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_openmp_clauses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_openmp_loop_form_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_openmp_mapping_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_option_ignored_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_ordered_compare_function_pointers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_out_of_line_declaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_out_of_scope_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_overlength_strings_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_overloaded_shift_op_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_overloaded_virtual_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_override_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_override_module_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_overriding_method_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_overriding_t_option_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_over_aligned_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_packed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_padded_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_parentheses_equality_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pass_failed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pch_date_time_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pedantic_core_features_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pedantic_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pessimizing_move_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_arith_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_bool_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_integer_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_sign_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_enum_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_int_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pointer_type_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_poison_system_directories_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_potentially_evaluated_expression_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragmas_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_clang_attribute_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_messages_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_once_outside_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_suspicious_include_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pragma_system_header_outside_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_predefined_identifier_outside_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_pedantic_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_pre_openmp51_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_private_extern_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_private_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_private_module_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_missing_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_out_of_date_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_unprofiled_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_property_access_dot_syntax_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_property_attribute_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_protocol_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_protocol_property_synthesis_ambiguity_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_psabi_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_qualified_void_return_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_quoted_include_in_framework_header_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_range_loop_analysis_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_range_loop_bind_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_range_loop_construct_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_readonly_iboutlet_property_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_receiver_expr_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_receiver_forward_class_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_redeclared_class_member_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_redundant_move_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_redundant_parens_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_register_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reinterpret_base_class_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reorder_ctor_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reorder_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reorder_init_list_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_requires_expression_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_requires_super_attribute_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reserved_identifier_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reserved_id_macro_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reserved_macro_identifier_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_reserved_user_defined_literal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_retained_language_linkage_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_return_stack_address_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_return_std_move_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_return_type_c_linkage_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_return_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_rewrite_not_bool_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_section_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_selector_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_selector_type_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_self_assign_field_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_self_assign_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_self_assign_overloaded_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_self_move_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_semicolon_before_method_body_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sentinel_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_serialized_diagnostics_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_modified_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_shadow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shadow_ivar_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shadow_uncaptured_local_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_shift_count_negative_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shift_count_overflow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shift_negative_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shift_op_parentheses_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shift_overflow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shift_sign_overflow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_shorten64_to32_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_signed_enum_bitfield_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_signed_unsigned_wchar_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sign_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sign_conversion_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_argument_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_decay_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_div_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_div_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_memaccess_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_slash_u_filename_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_slh_asm_goto_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_sometimes_uninitialized_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openmp_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_spir_compat_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_static_float_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_static_inline_explicit_instantiation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_static_in_inline_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_static_local_in_inline_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_static_self_init_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_stdlibcxx_not_found_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_strict_prototypes_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_strict_selector_match_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_string_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_string_concatenation_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_string_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_string_plus_char_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_string_plus_int_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_strlcpy_strlcat_size_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_strncat_size_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_suggest_destructor_override_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_suggest_override_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_super_class_method_mismatch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_suspicious_bzero_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_switch_bool_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_switch_enum_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_switch_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_sync_fetch_and_nand_semantics_changed_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_bitwise_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_in_range_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_out_of_range_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_objc_bool_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_overlap_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_pointer_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_type_limit_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_undefined_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_char_zero_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_enum_zero_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_zero_compare_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_tautological_value_range_compare_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_incomplete_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_analysis_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_attributes_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_beta_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_negative_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_precise_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_verbose_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_trigraphs_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_typedef_redefinition_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_typename_missing_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_type_safety_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unable_to_open_stats_file_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unavailable_declarations_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undeclared_selector_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_bool_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_func_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_inline_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_type_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_reinterpret_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undefined_var_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undef_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_undef_prefix_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_underaligned_exception_object_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unevaluated_expression_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_new_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unicode_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unicode_homoglyph_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unicode_whitespace_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unicode_zero_width_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_reference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unknown_argument_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unknown_attributes_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unknown_cuda_version_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unknown_escape_sequence_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unknown_pragmas_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unknown_sanitizers_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unknown_warning_option_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unnamed_type_template_args_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unneeded_internal_declaration_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unneeded_member_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_break_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_loop_increment_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_return_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsequenced_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abs_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_availability_guard_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_cb_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_dll_base_class_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_friend_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_gpopt_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_nan_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_target_opt_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unsupported_visibility_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unusable_partial_specialization_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_parameter_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_variable_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unused_comparison_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_const_variable_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_exception_parameter_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_getter_return_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_label_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_lambda_capture_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unused_local_typedef_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_macros_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_member_function_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_parameter_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unused_private_field_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_property_ivar_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_result_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_template_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_value_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_unused_variable_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_unused_volatile_lvalue_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_used_but_marked_unused_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_user_defined_literals_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_user_defined_warnings_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_varargs_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_variadic_macros_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_vector_conversion_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_vec_elem_size_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_vexing_parse_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_visibility_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_vla_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_enum_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_int_cast_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_void_ptr_dereference_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_warnings_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_wasm_exception_spec_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_weak_template_vtables_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_weak_vtables_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_writable_strings_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_xor_used_as_pow_highlighting=warning -resharper_cpp_clang_tidy_clang_diagnostic_zero_as_null_pointer_constant_highlighting=none -resharper_cpp_clang_tidy_clang_diagnostic_zero_length_array_highlighting=warning -resharper_cpp_clang_tidy_concurrency_mt_unsafe_highlighting=warning -resharper_cpp_clang_tidy_concurrency_thread_canceltype_asynchronous_highlighting=warning -resharper_cpp_clang_tidy_cppcoreguidelines_avoid_c_arrays_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_avoid_goto_highlighting=warning -resharper_cpp_clang_tidy_cppcoreguidelines_avoid_magic_numbers_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_avoid_non_const_global_variables_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_c_copy_assignment_signature_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_explicit_virtual_functions_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_init_variables_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_interfaces_global_init_highlighting=warning -resharper_cpp_clang_tidy_cppcoreguidelines_macro_usage_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_narrowing_conversions_highlighting=warning -resharper_cpp_clang_tidy_cppcoreguidelines_non_private_member_variables_in_classes_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_no_malloc_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_owning_memory_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_prefer_member_initializer_highlighting=suggestion -resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_array_to_pointer_decay_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_constant_array_index_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_pointer_arithmetic_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_const_cast_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_cstyle_cast_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_member_init_highlighting=warning -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_reinterpret_cast_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_static_cast_downcast_highlighting=suggestion -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_union_access_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_vararg_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_slicing_highlighting=none -resharper_cpp_clang_tidy_cppcoreguidelines_special_member_functions_highlighting=suggestion -resharper_cpp_clang_tidy_darwin_avoid_spinlock_highlighting=none -resharper_cpp_clang_tidy_darwin_dispatch_once_nonstatic_highlighting=none -resharper_cpp_clang_tidy_fuchsia_default_arguments_calls_highlighting=none -resharper_cpp_clang_tidy_fuchsia_default_arguments_declarations_highlighting=none -resharper_cpp_clang_tidy_fuchsia_header_anon_namespaces_highlighting=none -resharper_cpp_clang_tidy_fuchsia_multiple_inheritance_highlighting=none -resharper_cpp_clang_tidy_fuchsia_overloaded_operator_highlighting=none -resharper_cpp_clang_tidy_fuchsia_statically_constructed_objects_highlighting=none -resharper_cpp_clang_tidy_fuchsia_trailing_return_highlighting=none -resharper_cpp_clang_tidy_fuchsia_virtual_inheritance_highlighting=none -resharper_cpp_clang_tidy_google_build_explicit_make_pair_highlighting=none -resharper_cpp_clang_tidy_google_build_namespaces_highlighting=none -resharper_cpp_clang_tidy_google_build_using_namespace_highlighting=none -resharper_cpp_clang_tidy_google_default_arguments_highlighting=none -resharper_cpp_clang_tidy_google_explicit_constructor_highlighting=none -resharper_cpp_clang_tidy_google_global_names_in_headers_highlighting=none -resharper_cpp_clang_tidy_google_objc_avoid_nsobject_new_highlighting=none -resharper_cpp_clang_tidy_google_objc_avoid_throwing_exception_highlighting=none -resharper_cpp_clang_tidy_google_objc_function_naming_highlighting=none -resharper_cpp_clang_tidy_google_objc_global_variable_declaration_highlighting=none -resharper_cpp_clang_tidy_google_readability_avoid_underscore_in_googletest_name_highlighting=none -resharper_cpp_clang_tidy_google_readability_braces_around_statements_highlighting=none -resharper_cpp_clang_tidy_google_readability_casting_highlighting=none -resharper_cpp_clang_tidy_google_readability_function_size_highlighting=none -resharper_cpp_clang_tidy_google_readability_namespace_comments_highlighting=none -resharper_cpp_clang_tidy_google_readability_todo_highlighting=none -resharper_cpp_clang_tidy_google_runtime_int_highlighting=none -resharper_cpp_clang_tidy_google_runtime_operator_highlighting=warning -resharper_cpp_clang_tidy_google_upgrade_googletest_case_highlighting=suggestion -resharper_cpp_clang_tidy_hicpp_avoid_c_arrays_highlighting=none -resharper_cpp_clang_tidy_hicpp_avoid_goto_highlighting=warning -resharper_cpp_clang_tidy_hicpp_braces_around_statements_highlighting=none -resharper_cpp_clang_tidy_hicpp_deprecated_headers_highlighting=none -resharper_cpp_clang_tidy_hicpp_exception_baseclass_highlighting=suggestion -resharper_cpp_clang_tidy_hicpp_explicit_conversions_highlighting=none -resharper_cpp_clang_tidy_hicpp_function_size_highlighting=none -resharper_cpp_clang_tidy_hicpp_invalid_access_moved_highlighting=none -resharper_cpp_clang_tidy_hicpp_member_init_highlighting=none -resharper_cpp_clang_tidy_hicpp_move_const_arg_highlighting=none -resharper_cpp_clang_tidy_hicpp_multiway_paths_covered_highlighting=warning -resharper_cpp_clang_tidy_hicpp_named_parameter_highlighting=none -resharper_cpp_clang_tidy_hicpp_new_delete_operators_highlighting=none -resharper_cpp_clang_tidy_hicpp_noexcept_move_highlighting=none -resharper_cpp_clang_tidy_hicpp_no_array_decay_highlighting=none -resharper_cpp_clang_tidy_hicpp_no_assembler_highlighting=none -resharper_cpp_clang_tidy_hicpp_no_malloc_highlighting=none -resharper_cpp_clang_tidy_hicpp_signed_bitwise_highlighting=none -resharper_cpp_clang_tidy_hicpp_special_member_functions_highlighting=none -resharper_cpp_clang_tidy_hicpp_static_assert_highlighting=none -resharper_cpp_clang_tidy_hicpp_undelegated_constructor_highlighting=none -resharper_cpp_clang_tidy_hicpp_uppercase_literal_suffix_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_auto_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_emplace_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_equals_default_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_equals_delete_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_noexcept_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_nullptr_highlighting=none -resharper_cpp_clang_tidy_hicpp_use_override_highlighting=none -resharper_cpp_clang_tidy_hicpp_vararg_highlighting=none -resharper_cpp_clang_tidy_highlighting_highlighting=suggestion -resharper_cpp_clang_tidy_linuxkernel_must_check_errs_highlighting=warning -resharper_cpp_clang_tidy_llvmlibc_callee_namespace_highlighting=none -resharper_cpp_clang_tidy_llvmlibc_implementation_in_namespace_highlighting=none -resharper_cpp_clang_tidy_llvmlibc_restrict_system_libc_headers_highlighting=none -resharper_cpp_clang_tidy_llvm_else_after_return_highlighting=none -resharper_cpp_clang_tidy_llvm_header_guard_highlighting=none -resharper_cpp_clang_tidy_llvm_include_order_highlighting=none -resharper_cpp_clang_tidy_llvm_namespace_comment_highlighting=none -resharper_cpp_clang_tidy_llvm_prefer_isa_or_dyn_cast_in_conditionals_highlighting=none -resharper_cpp_clang_tidy_llvm_prefer_register_over_unsigned_highlighting=suggestion -resharper_cpp_clang_tidy_llvm_qualified_auto_highlighting=none -resharper_cpp_clang_tidy_llvm_twine_local_highlighting=none -resharper_cpp_clang_tidy_misc_definitions_in_headers_highlighting=none -resharper_cpp_clang_tidy_misc_misplaced_const_highlighting=warning -resharper_cpp_clang_tidy_misc_new_delete_overloads_highlighting=warning -resharper_cpp_clang_tidy_misc_non_copyable_objects_highlighting=warning -resharper_cpp_clang_tidy_misc_non_private_member_variables_in_classes_highlighting=none -resharper_cpp_clang_tidy_misc_no_recursion_highlighting=none -resharper_cpp_clang_tidy_misc_redundant_expression_highlighting=warning -resharper_cpp_clang_tidy_misc_static_assert_highlighting=suggestion -resharper_cpp_clang_tidy_misc_throw_by_value_catch_by_reference_highlighting=warning -resharper_cpp_clang_tidy_misc_unconventional_assign_operator_highlighting=warning -resharper_cpp_clang_tidy_misc_uniqueptr_reset_release_highlighting=suggestion -resharper_cpp_clang_tidy_misc_unused_alias_decls_highlighting=suggestion -resharper_cpp_clang_tidy_misc_unused_parameters_highlighting=none -resharper_cpp_clang_tidy_misc_unused_using_decls_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_avoid_bind_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_avoid_c_arrays_highlighting=none -resharper_cpp_clang_tidy_modernize_concat_nested_namespaces_highlighting=none -resharper_cpp_clang_tidy_modernize_deprecated_headers_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_deprecated_ios_base_aliases_highlighting=warning -resharper_cpp_clang_tidy_modernize_loop_convert_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_make_shared_highlighting=none -resharper_cpp_clang_tidy_modernize_make_unique_highlighting=none -resharper_cpp_clang_tidy_modernize_pass_by_value_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_raw_string_literal_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_redundant_void_arg_highlighting=none -resharper_cpp_clang_tidy_modernize_replace_auto_ptr_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_replace_disallow_copy_and_assign_macro_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_replace_random_shuffle_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_return_braced_init_list_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_shrink_to_fit_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_unary_static_assert_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_auto_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_bool_literals_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_default_member_init_highlighting=none -resharper_cpp_clang_tidy_modernize_use_emplace_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_equals_default_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_equals_delete_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_nodiscard_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_noexcept_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_nullptr_highlighting=none -resharper_cpp_clang_tidy_modernize_use_override_highlighting=none -resharper_cpp_clang_tidy_modernize_use_trailing_return_type_highlighting=none -resharper_cpp_clang_tidy_modernize_use_transparent_functors_highlighting=suggestion -resharper_cpp_clang_tidy_modernize_use_uncaught_exceptions_highlighting=warning -resharper_cpp_clang_tidy_modernize_use_using_highlighting=none -resharper_cpp_clang_tidy_mpi_buffer_deref_highlighting=warning -resharper_cpp_clang_tidy_mpi_type_mismatch_highlighting=warning -resharper_cpp_clang_tidy_objc_avoid_nserror_init_highlighting=warning -resharper_cpp_clang_tidy_objc_dealloc_in_category_highlighting=warning -resharper_cpp_clang_tidy_objc_forbidden_subclassing_highlighting=warning -resharper_cpp_clang_tidy_objc_missing_hash_highlighting=warning -resharper_cpp_clang_tidy_objc_nsinvocation_argument_lifetime_highlighting=warning -resharper_cpp_clang_tidy_objc_property_declaration_highlighting=warning -resharper_cpp_clang_tidy_objc_super_self_highlighting=warning -resharper_cpp_clang_tidy_openmp_exception_escape_highlighting=warning -resharper_cpp_clang_tidy_openmp_use_default_none_highlighting=warning -resharper_cpp_clang_tidy_performance_faster_string_find_highlighting=suggestion -resharper_cpp_clang_tidy_performance_for_range_copy_highlighting=suggestion -resharper_cpp_clang_tidy_performance_implicit_conversion_in_loop_highlighting=suggestion -resharper_cpp_clang_tidy_performance_inefficient_algorithm_highlighting=suggestion -resharper_cpp_clang_tidy_performance_inefficient_string_concatenation_highlighting=suggestion -resharper_cpp_clang_tidy_performance_inefficient_vector_operation_highlighting=suggestion -resharper_cpp_clang_tidy_performance_move_constructor_init_highlighting=warning -resharper_cpp_clang_tidy_performance_move_const_arg_highlighting=suggestion -resharper_cpp_clang_tidy_performance_noexcept_move_constructor_highlighting=none -resharper_cpp_clang_tidy_performance_no_automatic_move_highlighting=warning -resharper_cpp_clang_tidy_performance_no_int_to_ptr_highlighting=warning -resharper_cpp_clang_tidy_performance_trivially_destructible_highlighting=suggestion -resharper_cpp_clang_tidy_performance_type_promotion_in_math_fn_highlighting=suggestion -resharper_cpp_clang_tidy_performance_unnecessary_copy_initialization_highlighting=suggestion -resharper_cpp_clang_tidy_performance_unnecessary_value_param_highlighting=suggestion -resharper_cpp_clang_tidy_portability_restrict_system_includes_highlighting=none -resharper_cpp_clang_tidy_portability_simd_intrinsics_highlighting=none -resharper_cpp_clang_tidy_readability_avoid_const_params_in_decls_highlighting=none -resharper_cpp_clang_tidy_readability_braces_around_statements_highlighting=none -resharper_cpp_clang_tidy_readability_const_return_type_highlighting=none -resharper_cpp_clang_tidy_readability_container_size_empty_highlighting=suggestion -resharper_cpp_clang_tidy_readability_convert_member_functions_to_static_highlighting=none -resharper_cpp_clang_tidy_readability_delete_null_pointer_highlighting=suggestion -resharper_cpp_clang_tidy_readability_else_after_return_highlighting=none -resharper_cpp_clang_tidy_readability_function_cognitive_complexity_highlighting=none -resharper_cpp_clang_tidy_readability_function_size_highlighting=none -resharper_cpp_clang_tidy_readability_identifier_naming_highlighting=none -resharper_cpp_clang_tidy_readability_implicit_bool_conversion_highlighting=none -resharper_cpp_clang_tidy_readability_inconsistent_declaration_parameter_name_highlighting=suggestion -resharper_cpp_clang_tidy_readability_isolate_declaration_highlighting=none -resharper_cpp_clang_tidy_readability_magic_numbers_highlighting=none -resharper_cpp_clang_tidy_readability_make_member_function_const_highlighting=none -resharper_cpp_clang_tidy_readability_misleading_indentation_highlighting=none -resharper_cpp_clang_tidy_readability_misplaced_array_index_highlighting=suggestion -resharper_cpp_clang_tidy_readability_named_parameter_highlighting=none -resharper_cpp_clang_tidy_readability_non_const_parameter_highlighting=none -resharper_cpp_clang_tidy_readability_qualified_auto_highlighting=none -resharper_cpp_clang_tidy_readability_redundant_access_specifiers_highlighting=none -resharper_cpp_clang_tidy_readability_redundant_control_flow_highlighting=none -resharper_cpp_clang_tidy_readability_redundant_declaration_highlighting=suggestion -resharper_cpp_clang_tidy_readability_redundant_function_ptr_dereference_highlighting=suggestion -resharper_cpp_clang_tidy_readability_redundant_member_init_highlighting=none -resharper_cpp_clang_tidy_readability_redundant_preprocessor_highlighting=warning -resharper_cpp_clang_tidy_readability_redundant_smartptr_get_highlighting=suggestion -resharper_cpp_clang_tidy_readability_redundant_string_cstr_highlighting=suggestion -resharper_cpp_clang_tidy_readability_redundant_string_init_highlighting=suggestion -resharper_cpp_clang_tidy_readability_simplify_boolean_expr_highlighting=none -resharper_cpp_clang_tidy_readability_simplify_subscript_expr_highlighting=warning -resharper_cpp_clang_tidy_readability_static_accessed_through_instance_highlighting=suggestion -resharper_cpp_clang_tidy_readability_static_definition_in_anonymous_namespace_highlighting=none -resharper_cpp_clang_tidy_readability_string_compare_highlighting=warning -resharper_cpp_clang_tidy_readability_suspicious_call_argument_highlighting=warning -resharper_cpp_clang_tidy_readability_uniqueptr_delete_release_highlighting=suggestion -resharper_cpp_clang_tidy_readability_uppercase_literal_suffix_highlighting=none -resharper_cpp_clang_tidy_readability_use_anyofallof_highlighting=suggestion -resharper_cpp_clang_tidy_zircon_temporary_objects_highlighting=none -resharper_cpp_class_can_be_final_highlighting=hint -resharper_cpp_class_disallow_lazy_merging_highlighting=warning -resharper_cpp_class_is_incomplete_highlighting=warning -resharper_cpp_class_needs_constructor_because_of_uninitialized_member_highlighting=warning -resharper_cpp_class_never_used_highlighting=warning -resharper_cpp_compile_time_constant_can_be_replaced_with_boolean_constant_highlighting=suggestion -resharper_cpp_const_parameter_in_declaration_highlighting=suggestion -resharper_cpp_const_value_function_return_type_highlighting=suggestion -resharper_cpp_coroutine_call_resolve_error_highlighting=warning -resharper_cpp_cv_qualifier_can_not_be_applied_to_reference_highlighting=warning -resharper_cpp_c_style_cast_highlighting=suggestion -resharper_cpp_declaration_hides_local_highlighting=warning -resharper_cpp_declaration_hides_uncaptured_local_highlighting=hint -resharper_cpp_declaration_specifier_without_declarators_highlighting=warning -resharper_cpp_declarator_disambiguated_as_function_highlighting=warning -resharper_cpp_declarator_never_used_highlighting=warning -resharper_cpp_declarator_used_before_initialization_highlighting=error -resharper_cpp_defaulted_special_member_function_is_implicitly_deleted_highlighting=warning -resharper_cpp_default_case_not_handled_in_switch_statement_highlighting=warning -resharper_cpp_default_initialization_with_no_user_constructor_highlighting=warning -resharper_cpp_default_is_used_as_identifier_highlighting=warning -resharper_cpp_deleting_void_pointer_highlighting=warning -resharper_cpp_dependent_template_without_template_keyword_highlighting=warning -resharper_cpp_dependent_type_without_typename_keyword_highlighting=warning -resharper_cpp_deprecated_entity_highlighting=warning -resharper_cpp_deprecated_register_storage_class_specifier_highlighting=warning -resharper_cpp_dereference_operator_limit_exceeded_highlighting=warning -resharper_cpp_discarded_postfix_operator_result_highlighting=suggestion -resharper_cpp_doxygen_syntax_error_highlighting=warning -resharper_cpp_doxygen_undocumented_parameter_highlighting=suggestion -resharper_cpp_doxygen_unresolved_reference_highlighting=warning -resharper_cpp_empty_declaration_highlighting=warning -resharper_cpp_enforce_cv_qualifiers_order_highlighting=none -resharper_cpp_enforce_cv_qualifiers_placement_highlighting=none -resharper_cpp_enforce_do_statement_braces_highlighting=none -resharper_cpp_enforce_for_statement_braces_highlighting=none -resharper_cpp_enforce_function_declaration_style_highlighting=none -resharper_cpp_enforce_if_statement_braces_highlighting=none -resharper_cpp_enforce_nested_namespaces_style_highlighting=hint -resharper_cpp_enforce_overriding_destructor_style_highlighting=suggestion -resharper_cpp_enforce_overriding_function_style_highlighting=suggestion -resharper_cpp_enforce_type_alias_code_style_highlighting=none -resharper_cpp_enforce_while_statement_braces_highlighting=none -resharper_cpp_entity_assigned_but_no_read_highlighting=warning -resharper_cpp_entity_used_only_in_unevaluated_context_highlighting=warning -resharper_cpp_enumerator_never_used_highlighting=warning -resharper_cpp_equal_operands_in_binary_expression_highlighting=warning -resharper_cpp_explicit_specialization_in_non_namespace_scope_highlighting=warning -resharper_cpp_expression_without_side_effects_highlighting=warning -resharper_cpp_final_function_in_final_class_highlighting=suggestion -resharper_cpp_final_non_overriding_virtual_function_highlighting=suggestion -resharper_cpp_for_loop_can_be_replaced_with_while_highlighting=suggestion -resharper_cpp_functional_style_cast_highlighting=suggestion -resharper_cpp_function_doesnt_return_value_highlighting=warning -resharper_cpp_function_is_not_implemented_highlighting=warning -resharper_cpp_header_has_been_already_included_highlighting=hint -resharper_cpp_hidden_function_highlighting=warning -resharper_cpp_hiding_function_highlighting=warning -resharper_cpp_identical_operands_in_binary_expression_highlighting=warning -resharper_cpp_if_can_be_replaced_by_constexpr_if_highlighting=suggestion -resharper_cpp_implicit_default_constructor_not_available_highlighting=warning -resharper_cpp_incompatible_pointer_conversion_highlighting=warning -resharper_cpp_incomplete_switch_statement_highlighting=warning -resharper_cpp_inconsistent_naming_highlighting=hint -resharper_cpp_incorrect_blank_lines_near_braces_highlighting=none -resharper_cpp_initialized_value_is_always_rewritten_highlighting=warning -resharper_cpp_integral_to_pointer_conversion_highlighting=warning -resharper_cpp_invalid_line_continuation_highlighting=warning -resharper_cpp_join_declaration_and_assignment_highlighting=suggestion -resharper_cpp_lambda_capture_never_used_highlighting=warning -resharper_cpp_local_variable_may_be_const_highlighting=suggestion -resharper_cpp_local_variable_might_not_be_initialized_highlighting=warning -resharper_cpp_local_variable_with_non_trivial_dtor_is_never_used_highlighting=none -resharper_cpp_long_float_highlighting=warning -resharper_cpp_member_function_may_be_const_highlighting=suggestion -resharper_cpp_member_function_may_be_static_highlighting=suggestion -resharper_cpp_member_initializers_order_highlighting=suggestion -resharper_cpp_mismatched_class_tags_highlighting=warning -resharper_cpp_missing_blank_lines_highlighting=none -resharper_cpp_missing_include_guard_highlighting=warning -resharper_cpp_missing_indent_highlighting=none -resharper_cpp_missing_keyword_throw_highlighting=warning -resharper_cpp_missing_linebreak_highlighting=none -resharper_cpp_missing_space_highlighting=none -resharper_cpp_ms_ext_address_of_class_r_value_highlighting=warning -resharper_cpp_ms_ext_binding_r_value_to_lvalue_reference_highlighting=warning -resharper_cpp_ms_ext_copy_elision_in_copy_init_declarator_highlighting=warning -resharper_cpp_ms_ext_double_user_conversion_in_copy_init_highlighting=warning -resharper_cpp_ms_ext_not_initialized_static_const_local_var_highlighting=warning -resharper_cpp_ms_ext_reinterpret_cast_from_nullptr_highlighting=warning -resharper_cpp_multiple_spaces_highlighting=none -resharper_cpp_must_be_public_virtual_to_implement_interface_highlighting=warning -resharper_cpp_mutable_specifier_on_reference_member_highlighting=warning -resharper_cpp_nodiscard_function_without_return_value_highlighting=warning -resharper_cpp_non_exception_safe_resource_acquisition_highlighting=hint -resharper_cpp_non_explicit_conversion_operator_highlighting=hint -resharper_cpp_non_explicit_converting_constructor_highlighting=hint -resharper_cpp_non_inline_function_definition_in_header_file_highlighting=warning -resharper_cpp_non_inline_variable_definition_in_header_file_highlighting=warning -resharper_cpp_not_all_paths_return_value_highlighting=warning -resharper_cpp_no_discard_expression_highlighting=warning -resharper_cpp_object_member_might_not_be_initialized_highlighting=warning -resharper_cpp_outdent_is_off_prev_level_highlighting=none -resharper_cpp_out_parameter_must_be_written_highlighting=warning -resharper_cpp_parameter_may_be_const_highlighting=hint -resharper_cpp_parameter_may_be_const_ptr_or_ref_highlighting=suggestion -resharper_cpp_parameter_names_mismatch_highlighting=hint -resharper_cpp_parameter_never_used_highlighting=hint -resharper_cpp_parameter_value_is_reassigned_highlighting=warning -resharper_cpp_pointer_conversion_drops_qualifiers_highlighting=warning -resharper_cpp_pointer_to_integral_conversion_highlighting=warning -resharper_cpp_polymorphic_class_with_non_virtual_public_destructor_highlighting=warning -resharper_cpp_possibly_erroneous_empty_statements_highlighting=warning -resharper_cpp_possibly_uninitialized_member_highlighting=warning -resharper_cpp_possibly_unintended_object_slicing_highlighting=warning -resharper_cpp_precompiled_header_is_not_included_highlighting=error -resharper_cpp_precompiled_header_not_found_highlighting=error -resharper_cpp_printf_bad_format_highlighting=warning -resharper_cpp_printf_extra_arg_highlighting=warning -resharper_cpp_printf_missed_arg_highlighting=error -resharper_cpp_printf_risky_format_highlighting=warning -resharper_cpp_private_special_member_function_is_not_implemented_highlighting=warning -resharper_cpp_range_based_for_incompatible_reference_highlighting=warning -resharper_cpp_redefinition_of_default_argument_in_override_function_highlighting=warning -resharper_cpp_redundant_access_specifier_highlighting=hint -resharper_cpp_redundant_base_class_access_specifier_highlighting=hint -resharper_cpp_redundant_blank_lines_highlighting=none -resharper_cpp_redundant_boolean_expression_argument_highlighting=warning -resharper_cpp_redundant_cast_expression_highlighting=hint -resharper_cpp_redundant_const_specifier_highlighting=hint -resharper_cpp_redundant_control_flow_jump_highlighting=hint -resharper_cpp_redundant_elaborated_type_specifier_highlighting=hint -resharper_cpp_redundant_else_keyword_highlighting=hint -resharper_cpp_redundant_else_keyword_inside_compound_statement_highlighting=hint -resharper_cpp_redundant_empty_declaration_highlighting=hint -resharper_cpp_redundant_empty_statement_highlighting=hint -resharper_cpp_redundant_explicit_template_arguments_highlighting=hint -resharper_cpp_redundant_inline_specifier_highlighting=hint -resharper_cpp_redundant_lambda_parameter_list_highlighting=hint -resharper_cpp_redundant_linebreak_highlighting=none -resharper_cpp_redundant_member_initializer_highlighting=suggestion -resharper_cpp_redundant_namespace_definition_highlighting=suggestion -resharper_cpp_redundant_parentheses_highlighting=hint -resharper_cpp_redundant_qualifier_highlighting=hint -resharper_cpp_redundant_space_highlighting=none -resharper_cpp_redundant_static_specifier_on_member_allocation_function_highlighting=hint -resharper_cpp_redundant_template_keyword_highlighting=warning -resharper_cpp_redundant_typename_keyword_highlighting=warning -resharper_cpp_redundant_void_argument_list_highlighting=suggestion -resharper_cpp_reinterpret_cast_from_void_ptr_highlighting=suggestion -resharper_cpp_remove_redundant_braces_highlighting=none -resharper_cpp_replace_memset_with_zero_initialization_highlighting=suggestion -resharper_cpp_replace_tie_with_structured_binding_highlighting=suggestion -resharper_cpp_return_no_value_in_non_void_function_highlighting=warning -resharper_cpp_smart_pointer_vs_make_function_highlighting=suggestion -resharper_cpp_some_object_members_might_not_be_initialized_highlighting=warning -resharper_cpp_special_function_without_noexcept_specification_highlighting=warning -resharper_cpp_static_data_member_in_unnamed_struct_highlighting=warning -resharper_cpp_static_specifier_on_anonymous_namespace_member_highlighting=suggestion -resharper_cpp_string_literal_to_char_pointer_conversion_highlighting=warning -resharper_cpp_syntax_warning_highlighting=warning -resharper_cpp_tabs_and_spaces_mismatch_highlighting=none -resharper_cpp_tabs_are_disallowed_highlighting=none -resharper_cpp_tabs_outside_indent_highlighting=none -resharper_cpp_template_parameter_shadowing_highlighting=warning -resharper_cpp_this_arg_member_func_delegate_ctor_is_unsuported_by_dot_net_core_highlighting=none -resharper_cpp_throw_expression_can_be_replaced_with_rethrow_highlighting=warning -resharper_cpp_too_wide_scope_highlighting=suggestion -resharper_cpp_too_wide_scope_init_statement_highlighting=hint -resharper_cpp_type_alias_never_used_highlighting=warning -resharper_cpp_ue4_blueprint_callable_function_may_be_const_highlighting=hint -resharper_cpp_ue4_blueprint_callable_function_may_be_static_highlighting=hint -resharper_cpp_ue4_coding_standard_naming_violation_warning_highlighting=hint -resharper_cpp_ue4_coding_standard_u_class_naming_violation_error_highlighting=error -resharper_cpp_ue4_probable_memory_issues_with_u_objects_in_container_highlighting=warning -resharper_cpp_ue4_probable_memory_issues_with_u_object_highlighting=warning -resharper_cpp_ue_blueprint_callable_function_unused_highlighting=warning -resharper_cpp_ue_blueprint_implementable_event_not_implemented_highlighting=warning -resharper_cpp_ue_incorrect_engine_directory_highlighting=error -resharper_cpp_ue_non_existent_input_action_highlighting=warning -resharper_cpp_ue_non_existent_input_axis_highlighting=warning -resharper_cpp_ue_source_file_without_predefined_macros_highlighting=warning -resharper_cpp_ue_source_file_without_standard_library_highlighting=error -resharper_cpp_ue_version_file_doesnt_exist_highlighting=error -resharper_cpp_uninitialized_dependent_base_class_highlighting=warning -resharper_cpp_uninitialized_non_static_data_member_highlighting=warning -resharper_cpp_union_member_of_reference_type_highlighting=warning -resharper_cpp_unnamed_namespace_in_header_file_highlighting=warning -resharper_cpp_unnecessary_whitespace_highlighting=none -resharper_cpp_unreachable_code_highlighting=warning -resharper_cpp_unsigned_zero_comparison_highlighting=warning -resharper_cpp_unused_include_directive_highlighting=warning -resharper_cpp_user_defined_literal_suffix_does_not_start_with_underscore_highlighting=warning -resharper_cpp_use_algorithm_with_count_highlighting=suggestion -resharper_cpp_use_associative_contains_highlighting=suggestion -resharper_cpp_use_auto_for_numeric_highlighting=hint -resharper_cpp_use_auto_highlighting=hint -resharper_cpp_use_elements_view_highlighting=suggestion -resharper_cpp_use_erase_algorithm_highlighting=suggestion -resharper_cpp_use_familiar_template_syntax_for_generic_lambdas_highlighting=suggestion -resharper_cpp_use_range_algorithm_highlighting=suggestion -resharper_cpp_use_std_size_highlighting=suggestion -resharper_cpp_use_structured_binding_highlighting=hint -resharper_cpp_use_type_trait_alias_highlighting=suggestion -resharper_cpp_using_result_of_assignment_as_condition_highlighting=warning -resharper_cpp_u_function_macro_call_has_no_effect_highlighting=warning -resharper_cpp_u_property_macro_call_has_no_effect_highlighting=warning -resharper_cpp_variable_can_be_made_constexpr_highlighting=suggestion -resharper_cpp_virtual_function_call_inside_ctor_highlighting=warning -resharper_cpp_virtual_function_in_final_class_highlighting=warning -resharper_cpp_volatile_parameter_in_declaration_highlighting=suggestion -resharper_cpp_wrong_includes_order_highlighting=hint -resharper_cpp_wrong_indent_size_highlighting=none -resharper_cpp_wrong_slashes_in_include_directive_highlighting=hint -resharper_cpp_zero_constant_can_be_replaced_with_nullptr_highlighting=suggestion -resharper_cpp_zero_valued_expression_used_as_null_pointer_highlighting=warning -resharper_create_specialized_overload_highlighting=hint -resharper_css_browser_compatibility_highlighting=warning -resharper_css_caniuse_feature_requires_prefix_highlighting=hint -resharper_css_caniuse_unsupported_feature_highlighting=hint -resharper_css_not_resolved_highlighting=error -resharper_css_obsolete_highlighting=hint -resharper_css_property_does_not_override_vendor_property_highlighting=warning -resharper_cyclic_reference_comment_highlighting=none -resharper_c_declaration_with_implicit_int_type_highlighting=warning -resharper_c_sharp_build_cs_invalid_module_name_highlighting=warning -resharper_c_sharp_missing_plugin_dependency_highlighting=warning -resharper_declaration_hides_highlighting=hint -resharper_declaration_is_empty_highlighting=warning -resharper_declaration_visibility_error_highlighting=error -resharper_default_value_attribute_for_optional_parameter_highlighting=warning -resharper_deleting_non_qualified_reference_highlighting=error -resharper_dl_tag_contains_non_dt_or_dd_elements_highlighting=hint -resharper_double_colons_expected_highlighting=error -resharper_double_colons_preferred_highlighting=suggestion -resharper_double_negation_in_pattern_highlighting=suggestion -resharper_double_negation_of_boolean_highlighting=warning -resharper_double_negation_operator_highlighting=suggestion -resharper_duplicate_identifier_error_highlighting=error -resharper_duplicate_reference_comment_highlighting=warning -resharper_duplicate_resource_highlighting=warning -resharper_duplicating_local_declaration_highlighting=warning -resharper_duplicating_parameter_declaration_error_highlighting=error -resharper_duplicating_property_declaration_error_highlighting=error -resharper_duplicating_property_declaration_highlighting=warning -resharper_duplicating_switch_label_highlighting=warning -resharper_dynamic_shift_right_op_is_not_int_highlighting=warning -resharper_elided_trailing_element_highlighting=warning -resharper_empty_constructor_highlighting=warning -resharper_empty_destructor_highlighting=warning -resharper_empty_embedded_statement_highlighting=warning -resharper_empty_for_statement_highlighting=warning -resharper_empty_general_catch_clause_highlighting=warning -resharper_empty_namespace_highlighting=warning -resharper_empty_object_property_declaration_highlighting=error -resharper_empty_return_value_for_type_annotated_function_highlighting=warning -resharper_empty_statement_highlighting=warning -resharper_empty_title_tag_highlighting=hint -resharper_enforce_do_while_statement_braces_highlighting=none -resharper_enforce_fixed_statement_braces_highlighting=none -resharper_enforce_foreach_statement_braces_highlighting=none -resharper_enforce_for_statement_braces_highlighting=none -resharper_enforce_if_statement_braces_highlighting=none -resharper_enforce_lock_statement_braces_highlighting=none -resharper_enforce_using_statement_braces_highlighting=none -resharper_enforce_while_statement_braces_highlighting=none -resharper_entity_name_captured_only_global_highlighting=warning -resharper_entity_name_captured_only_local_highlighting=warning -resharper_enumerable_sum_in_explicit_unchecked_context_highlighting=warning -resharper_enum_underlying_type_is_int_highlighting=warning -resharper_equal_expression_comparison_highlighting=warning -resharper_error_in_xml_doc_reference_highlighting=error -resharper_es6_feature_highlighting=error -resharper_es7_feature_highlighting=error -resharper_eval_arguments_name_error_highlighting=error -resharper_event_never_invoked_global_highlighting=suggestion -resharper_event_never_subscribed_to_global_highlighting=suggestion -resharper_event_never_subscribed_to_local_highlighting=suggestion -resharper_event_unsubscription_via_anonymous_delegate_highlighting=warning -resharper_experimental_feature_highlighting=error -resharper_explicit_caller_info_argument_highlighting=warning -resharper_expression_is_always_const_highlighting=warning -resharper_expression_is_always_null_highlighting=warning -resharper_field_can_be_made_read_only_global_highlighting=suggestion -resharper_field_can_be_made_read_only_local_highlighting=suggestion -resharper_field_hides_interface_property_with_default_implementation_highlighting=warning -resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting=hint -resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting=hint -resharper_format_string_placeholders_mismatch_highlighting=warning -resharper_format_string_problem_highlighting=warning -resharper_for_can_be_converted_to_foreach_highlighting=suggestion -resharper_for_statement_condition_is_true_highlighting=warning -resharper_functions_used_before_declared_highlighting=none -resharper_function_complexity_overflow_highlighting=none -resharper_function_never_returns_highlighting=warning -resharper_function_parameter_named_arguments_highlighting=warning -resharper_function_recursive_on_all_paths_highlighting=warning -resharper_function_used_out_of_scope_highlighting=warning -resharper_gc_suppress_finalize_for_type_without_destructor_highlighting=warning -resharper_generic_enumerator_not_disposed_highlighting=warning -resharper_heuristically_unreachable_code_highlighting=warning -resharper_heuristic_unreachable_code_highlighting=warning -resharper_hex_color_value_with_alpha_highlighting=error -resharper_html_attributes_quotes_highlighting=hint -resharper_html_attribute_not_resolved_highlighting=warning -resharper_html_attribute_value_not_resolved_highlighting=warning -resharper_html_dead_code_highlighting=warning -resharper_html_event_not_resolved_highlighting=warning -resharper_html_id_duplication_highlighting=warning -resharper_html_id_not_resolved_highlighting=warning -resharper_html_obsolete_highlighting=warning -resharper_html_path_error_highlighting=warning -resharper_html_tag_not_closed_highlighting=error -resharper_html_tag_not_resolved_highlighting=warning -resharper_html_tag_should_be_self_closed_highlighting=warning -resharper_html_tag_should_not_be_self_closed_highlighting=warning -resharper_html_warning_highlighting=warning -resharper_identifier_typo_highlighting=suggestion -resharper_implicit_any_error_highlighting=error -resharper_implicit_any_type_warning_highlighting=warning -resharper_import_keyword_not_with_invocation_highlighting=error -resharper_inactive_preprocessor_branch_highlighting=warning -resharper_inconsistently_synchronized_field_highlighting=warning -resharper_inconsistent_function_returns_highlighting=warning -resharper_inconsistent_naming_highlighting=warning -resharper_inconsistent_order_of_locks_highlighting=warning -resharper_incorrect_blank_lines_near_braces_highlighting=none -resharper_incorrect_operand_in_type_of_comparison_highlighting=warning -resharper_incorrect_triple_slash_location_highlighting=warning -resharper_indexing_by_invalid_range_highlighting=warning -resharper_inheritdoc_consider_usage_highlighting=none -resharper_inheritdoc_invalid_usage_highlighting=warning -resharper_inline_out_variable_declaration_highlighting=suggestion -resharper_inline_temporary_variable_highlighting=hint -resharper_internal_module_highlighting=suggestion -resharper_internal_or_private_member_not_documented_highlighting=none -resharper_interpolated_string_expression_is_not_i_formattable_highlighting=warning -resharper_introduce_optional_parameters_global_highlighting=suggestion -resharper_introduce_optional_parameters_local_highlighting=suggestion -resharper_introduce_variable_to_apply_guard_highlighting=hint -resharper_int_division_by_zero_highlighting=warning -resharper_int_variable_overflow_highlighting=warning -resharper_int_variable_overflow_in_checked_context_highlighting=warning -resharper_int_variable_overflow_in_unchecked_context_highlighting=warning -resharper_invalid_attribute_value_highlighting=warning -resharper_invalid_json_syntax_highlighting=error -resharper_invalid_task_element_highlighting=none -resharper_invalid_value_highlighting=error -resharper_invalid_value_type_highlighting=warning -resharper_invalid_xml_doc_comment_highlighting=warning -resharper_invert_condition_1_highlighting=hint -resharper_invert_if_highlighting=hint -resharper_invocation_is_skipped_highlighting=hint -resharper_invocation_of_non_function_highlighting=warning -resharper_invoked_expression_maybe_non_function_highlighting=warning -resharper_invoke_as_extension_method_highlighting=suggestion -resharper_is_expression_always_false_highlighting=warning -resharper_is_expression_always_true_highlighting=warning -resharper_iterator_method_result_is_ignored_highlighting=warning -resharper_iterator_never_returns_highlighting=warning -resharper_join_declaration_and_initializer_highlighting=suggestion -resharper_join_declaration_and_initializer_js_highlighting=suggestion -resharper_join_null_check_with_usage_highlighting=suggestion -resharper_join_null_check_with_usage_when_possible_highlighting=none -resharper_json_validation_failed_highlighting=error -resharper_js_path_not_found_highlighting=error -resharper_js_unreachable_code_highlighting=warning -resharper_jump_must_be_in_loop_highlighting=warning -resharper_label_or_semicolon_expected_highlighting=error -resharper_lambda_expression_can_be_made_static_highlighting=none -resharper_lambda_expression_must_be_static_highlighting=suggestion -resharper_lambda_highlighting=suggestion -resharper_lambda_should_not_capture_context_highlighting=warning -resharper_less_specific_overload_than_main_signature_highlighting=warning -resharper_lexical_declaration_needs_block_highlighting=error -resharper_localizable_element_highlighting=warning -resharper_local_function_can_be_made_static_highlighting=none -resharper_local_function_hides_method_highlighting=warning -resharper_local_function_redefined_later_highlighting=warning -resharper_local_variable_hides_member_highlighting=warning -resharper_long_literal_ending_lower_l_highlighting=warning -resharper_loop_can_be_converted_to_query_highlighting=hint -resharper_loop_can_be_partly_converted_to_query_highlighting=none -resharper_loop_variable_is_never_changed_inside_loop_highlighting=warning -resharper_l_value_is_expected_highlighting=error -resharper_markup_attribute_typo_highlighting=suggestion -resharper_markup_text_typo_highlighting=suggestion -resharper_math_abs_method_is_redundant_highlighting=warning -resharper_math_clamp_min_greater_than_max_highlighting=warning -resharper_meaningless_default_parameter_value_highlighting=warning -resharper_member_can_be_internal_highlighting=none -resharper_member_can_be_made_static_global_highlighting=hint -resharper_member_can_be_made_static_local_highlighting=hint -resharper_member_can_be_private_global_highlighting=suggestion -resharper_member_can_be_private_local_highlighting=suggestion -resharper_member_can_be_protected_global_highlighting=suggestion -resharper_member_can_be_protected_local_highlighting=suggestion -resharper_member_hides_interface_member_with_default_implementation_highlighting=warning -resharper_member_hides_static_from_outer_class_highlighting=warning -resharper_member_initializer_value_ignored_highlighting=warning -resharper_merge_and_pattern_highlighting=suggestion -resharper_merge_cast_with_type_check_highlighting=suggestion -resharper_merge_conditional_expression_highlighting=suggestion -resharper_merge_conditional_expression_when_possible_highlighting=none -resharper_merge_into_logical_pattern_highlighting=hint -resharper_merge_into_negated_pattern_highlighting=hint -resharper_merge_into_pattern_highlighting=suggestion -resharper_merge_nested_property_patterns_highlighting=suggestion -resharper_merge_sequential_checks_highlighting=hint -resharper_merge_sequential_checks_when_possible_highlighting=none -resharper_method_has_async_overload_highlighting=suggestion -resharper_method_has_async_overload_with_cancellation_highlighting=suggestion -resharper_method_overload_with_optional_parameter_highlighting=warning -resharper_method_safe_this_highlighting=suggestion -resharper_method_supports_cancellation_highlighting=suggestion -resharper_missing_alt_attribute_in_img_tag_highlighting=hint -resharper_missing_attribute_highlighting=warning -resharper_missing_blank_lines_highlighting=none -resharper_missing_body_tag_highlighting=warning -resharper_missing_has_own_property_in_foreach_highlighting=warning -resharper_missing_head_and_body_tags_highlighting=warning -resharper_missing_head_tag_highlighting=warning -resharper_missing_indent_highlighting=none -resharper_missing_linebreak_highlighting=none -resharper_missing_space_highlighting=none -resharper_missing_title_tag_highlighting=hint -resharper_misuse_of_owner_function_this_highlighting=warning -resharper_more_specific_foreach_variable_type_available_highlighting=suggestion -resharper_more_specific_signature_after_less_specific_highlighting=warning -resharper_move_to_existing_positional_deconstruction_pattern_highlighting=hint -resharper_multiple_declarations_in_foreach_highlighting=error -resharper_multiple_nullable_attributes_usage_highlighting=warning -resharper_multiple_order_by_highlighting=warning -resharper_multiple_output_tags_highlighting=warning -resharper_multiple_resolve_candidates_in_text_highlighting=warning -resharper_multiple_spaces_highlighting=none -resharper_multiple_statements_on_one_line_highlighting=none -resharper_multiple_type_members_on_one_line_highlighting=none -resharper_must_use_return_value_highlighting=warning -resharper_mvc_action_not_resolved_highlighting=error -resharper_mvc_area_not_resolved_highlighting=error -resharper_mvc_controller_not_resolved_highlighting=error -resharper_mvc_invalid_model_type_highlighting=error -resharper_mvc_masterpage_not_resolved_highlighting=error -resharper_mvc_partial_view_not_resolved_highlighting=error -resharper_mvc_template_not_resolved_highlighting=error -resharper_mvc_view_component_not_resolved_highlighting=error -resharper_mvc_view_component_view_not_resolved_highlighting=error -resharper_mvc_view_not_resolved_highlighting=error -resharper_native_type_prototype_extending_highlighting=warning -resharper_native_type_prototype_overwriting_highlighting=warning -resharper_negation_of_relational_pattern_highlighting=suggestion -resharper_negative_equality_expression_highlighting=suggestion -resharper_negative_index_highlighting=warning -resharper_nested_string_interpolation_highlighting=suggestion -resharper_non_assigned_constant_highlighting=error -resharper_non_atomic_compound_operator_highlighting=warning -resharper_non_constant_equality_expression_has_constant_result_highlighting=warning -resharper_non_parsable_element_highlighting=warning -resharper_non_readonly_member_in_get_hash_code_highlighting=warning -resharper_non_volatile_field_in_double_check_locking_highlighting=warning -resharper_not_accessed_field_global_highlighting=suggestion -resharper_not_accessed_field_local_highlighting=warning -resharper_not_accessed_positional_property_global_highlighting=warning -resharper_not_accessed_positional_property_local_highlighting=warning -resharper_not_accessed_variable_highlighting=warning -resharper_not_all_paths_return_value_highlighting=warning -resharper_not_assigned_out_parameter_highlighting=warning -resharper_not_declared_in_parent_culture_highlighting=warning -resharper_not_null_member_is_not_initialized_highlighting=warning -resharper_not_observable_annotation_redundancy_highlighting=warning -resharper_not_overridden_in_specific_culture_highlighting=warning -resharper_not_resolved_highlighting=warning -resharper_not_resolved_in_text_highlighting=warning -resharper_nullable_warning_suppression_is_used_highlighting=none -resharper_n_unit_async_method_must_be_task_highlighting=warning -resharper_n_unit_attribute_produces_too_many_tests_highlighting=none -resharper_n_unit_auto_fixture_incorrect_argument_type_highlighting=warning -resharper_n_unit_auto_fixture_missed_test_attribute_highlighting=warning -resharper_n_unit_auto_fixture_missed_test_or_test_fixture_attribute_highlighting=warning -resharper_n_unit_auto_fixture_redundant_argument_in_inline_auto_data_attribute_highlighting=warning -resharper_n_unit_duplicate_values_highlighting=warning -resharper_n_unit_ignored_parameter_attribute_highlighting=warning -resharper_n_unit_implicit_unspecified_null_values_highlighting=warning -resharper_n_unit_incorrect_argument_type_highlighting=warning -resharper_n_unit_incorrect_expected_result_type_highlighting=warning -resharper_n_unit_incorrect_range_bounds_highlighting=warning -resharper_n_unit_method_with_parameters_and_test_attribute_highlighting=warning -resharper_n_unit_missing_arguments_in_test_case_attribute_highlighting=warning -resharper_n_unit_non_public_method_with_test_attribute_highlighting=warning -resharper_n_unit_no_values_provided_highlighting=warning -resharper_n_unit_parameter_type_is_not_compatible_with_attribute_highlighting=warning -resharper_n_unit_range_attribute_bounds_are_out_of_range_highlighting=warning -resharper_n_unit_range_step_sign_mismatch_highlighting=warning -resharper_n_unit_range_step_value_must_not_be_zero_highlighting=warning -resharper_n_unit_range_to_value_is_not_reachable_highlighting=warning -resharper_n_unit_redundant_argument_instead_of_expected_result_highlighting=warning -resharper_n_unit_redundant_argument_in_test_case_attribute_highlighting=warning -resharper_n_unit_redundant_expected_result_in_test_case_attribute_highlighting=warning -resharper_n_unit_test_case_attribute_requires_expected_result_highlighting=warning -resharper_n_unit_test_case_result_property_duplicates_expected_result_highlighting=warning -resharper_n_unit_test_case_result_property_is_obsolete_highlighting=warning -resharper_n_unit_test_case_source_cannot_be_resolved_highlighting=warning -resharper_n_unit_test_case_source_must_be_field_property_method_highlighting=warning -resharper_n_unit_test_case_source_must_be_static_highlighting=warning -resharper_n_unit_test_case_source_should_implement_i_enumerable_highlighting=warning -resharper_object_creation_as_statement_highlighting=warning -resharper_object_destructuring_without_parentheses_highlighting=error -resharper_object_literals_are_not_comma_free_highlighting=error -resharper_obsolete_element_error_highlighting=error -resharper_obsolete_element_highlighting=warning -resharper_octal_literals_not_allowed_error_highlighting=error -resharper_ol_tag_contains_non_li_elements_highlighting=hint -resharper_one_way_operation_contract_with_return_type_highlighting=warning -resharper_operation_contract_without_service_contract_highlighting=warning -resharper_operator_is_can_be_used_highlighting=warning -resharper_optional_parameter_hierarchy_mismatch_highlighting=warning -resharper_optional_parameter_ref_out_highlighting=warning -resharper_other_tags_inside_script1_highlighting=error -resharper_other_tags_inside_script2_highlighting=error -resharper_other_tags_inside_unclosed_script_highlighting=error -resharper_outdent_is_off_prev_level_highlighting=none -resharper_output_tag_required_highlighting=warning -resharper_out_parameter_value_is_always_discarded_global_highlighting=suggestion -resharper_out_parameter_value_is_always_discarded_local_highlighting=warning -resharper_overload_signature_inferring_highlighting=hint -resharper_overridden_with_empty_value_highlighting=warning -resharper_overridden_with_same_value_highlighting=suggestion -resharper_parameter_doesnt_make_any_sense_highlighting=warning -resharper_parameter_hides_member_highlighting=warning -resharper_parameter_only_used_for_precondition_check_global_highlighting=suggestion -resharper_parameter_only_used_for_precondition_check_local_highlighting=warning -resharper_parameter_type_can_be_enumerable_global_highlighting=hint -resharper_parameter_type_can_be_enumerable_local_highlighting=hint -resharper_parameter_value_is_not_used_highlighting=warning -resharper_partial_method_parameter_name_mismatch_highlighting=warning -resharper_partial_method_with_single_part_highlighting=warning -resharper_partial_type_with_single_part_highlighting=warning -resharper_pass_string_interpolation_highlighting=hint -resharper_path_not_resolved_highlighting=error -resharper_pattern_always_matches_highlighting=warning -resharper_pattern_is_always_true_or_false_highlighting=warning -resharper_pattern_never_matches_highlighting=warning -resharper_polymorphic_field_like_event_invocation_highlighting=warning -resharper_possible_infinite_inheritance_highlighting=warning -resharper_possible_intended_rethrow_highlighting=warning -resharper_possible_interface_member_ambiguity_highlighting=warning -resharper_possible_invalid_cast_exception_highlighting=warning -resharper_possible_invalid_cast_exception_in_foreach_loop_highlighting=warning -resharper_possible_invalid_operation_exception_highlighting=warning -resharper_possible_loss_of_fraction_highlighting=warning -resharper_possible_mistaken_argument_highlighting=warning -resharper_possible_mistaken_call_to_get_type_1_highlighting=warning -resharper_possible_mistaken_call_to_get_type_2_highlighting=warning -resharper_possible_multiple_enumeration_highlighting=warning -resharper_possible_multiple_write_access_in_double_check_locking_highlighting=warning -resharper_possible_null_reference_exception_highlighting=warning -resharper_possible_struct_member_modification_of_non_variable_struct_highlighting=warning -resharper_possible_unintended_linear_search_in_set_highlighting=warning -resharper_possible_unintended_queryable_as_enumerable_highlighting=suggestion -resharper_possible_unintended_reference_comparison_highlighting=warning -resharper_possible_write_to_me_highlighting=warning -resharper_possibly_impure_method_call_on_readonly_variable_highlighting=warning -resharper_possibly_incorrectly_broken_statement_highlighting=warning -resharper_possibly_missing_indexer_initializer_comma_highlighting=warning -resharper_possibly_mistaken_use_of_interpolated_string_insert_highlighting=warning -resharper_possibly_mistaken_use_of_params_method_highlighting=warning -resharper_possibly_unassigned_property_highlighting=hint -resharper_private_field_can_be_converted_to_local_variable_highlighting=warning -resharper_private_variable_can_be_made_readonly_highlighting=hint -resharper_property_can_be_made_init_only_global_highlighting=suggestion -resharper_property_can_be_made_init_only_local_highlighting=suggestion -resharper_property_getter_cannot_have_parameters_highlighting=error -resharper_property_not_resolved_highlighting=error -resharper_property_setter_must_have_single_parameter_highlighting=error -resharper_public_constructor_in_abstract_class_highlighting=suggestion -resharper_pure_attribute_on_void_method_highlighting=warning -resharper_qualified_expression_is_null_highlighting=warning -resharper_qualified_expression_maybe_null_highlighting=warning -resharper_razor_layout_not_resolved_highlighting=error -resharper_razor_section_not_resolved_highlighting=error -resharper_read_access_in_double_check_locking_highlighting=warning -resharper_redundant_abstract_modifier_highlighting=warning -resharper_redundant_always_match_subpattern_highlighting=suggestion -resharper_redundant_anonymous_type_property_name_highlighting=warning -resharper_redundant_argument_default_value_highlighting=warning -resharper_redundant_array_creation_expression_highlighting=hint -resharper_redundant_array_lower_bound_specification_highlighting=warning -resharper_redundant_assignment_highlighting=warning -resharper_redundant_attribute_parentheses_highlighting=hint -resharper_redundant_attribute_usage_property_highlighting=suggestion -resharper_redundant_base_constructor_call_highlighting=warning -resharper_redundant_base_qualifier_highlighting=warning -resharper_redundant_blank_lines_highlighting=none -resharper_redundant_block_highlighting=warning -resharper_redundant_bool_compare_highlighting=warning -resharper_redundant_case_label_highlighting=warning -resharper_redundant_cast_highlighting=warning -resharper_redundant_catch_clause_highlighting=warning -resharper_redundant_check_before_assignment_highlighting=warning -resharper_redundant_collection_initializer_element_braces_highlighting=hint -resharper_redundant_comparison_with_boolean_highlighting=warning -resharper_redundant_configure_await_highlighting=suggestion -resharper_redundant_css_hack_highlighting=warning -resharper_redundant_declaration_semicolon_highlighting=hint -resharper_redundant_default_member_initializer_highlighting=warning -resharper_redundant_delegate_creation_highlighting=warning -resharper_redundant_disable_warning_comment_highlighting=warning -resharper_redundant_discard_designation_highlighting=suggestion -resharper_redundant_else_block_highlighting=warning -resharper_redundant_empty_case_else_highlighting=warning -resharper_redundant_empty_constructor_highlighting=warning -resharper_redundant_empty_finally_block_highlighting=warning -resharper_redundant_empty_object_creation_argument_list_highlighting=hint -resharper_redundant_empty_object_or_collection_initializer_highlighting=warning -resharper_redundant_empty_switch_section_highlighting=warning -resharper_redundant_enumerable_cast_call_highlighting=warning -resharper_redundant_enum_case_label_for_default_section_highlighting=none -resharper_redundant_explicit_array_creation_highlighting=warning -resharper_redundant_explicit_array_size_highlighting=warning -resharper_redundant_explicit_nullable_creation_highlighting=warning -resharper_redundant_explicit_params_array_creation_highlighting=suggestion -resharper_redundant_explicit_positional_property_declaration_highlighting=warning -resharper_redundant_explicit_tuple_component_name_highlighting=warning -resharper_redundant_extends_list_entry_highlighting=warning -resharper_redundant_fixed_pointer_declaration_highlighting=suggestion -resharper_redundant_highlighting=warning -resharper_redundant_if_else_block_highlighting=hint -resharper_redundant_if_statement_then_keyword_highlighting=none -resharper_redundant_immediate_delegate_invocation_highlighting=suggestion -resharper_redundant_intermediate_variable_highlighting=hint -resharper_redundant_is_before_relational_pattern_highlighting=suggestion -resharper_redundant_iterator_keyword_highlighting=warning -resharper_redundant_jump_statement_highlighting=warning -resharper_redundant_lambda_parameter_type_highlighting=warning -resharper_redundant_lambda_signature_parentheses_highlighting=hint -resharper_redundant_linebreak_highlighting=none -resharper_redundant_local_class_name_highlighting=hint -resharper_redundant_local_function_name_highlighting=hint -resharper_redundant_logical_conditional_expression_operand_highlighting=warning -resharper_redundant_me_qualifier_highlighting=warning -resharper_redundant_my_base_qualifier_highlighting=warning -resharper_redundant_my_class_qualifier_highlighting=warning -resharper_redundant_name_qualifier_highlighting=warning -resharper_redundant_not_null_constraint_highlighting=warning -resharper_redundant_nullable_annotation_on_reference_type_constraint_highlighting=warning -resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_base_type_highlighting=warning -resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_type_kind_highlighting=warning -resharper_redundant_nullable_flow_attribute_highlighting=warning -resharper_redundant_nullable_type_mark_highlighting=warning -resharper_redundant_nullness_attribute_with_nullable_reference_types_highlighting=warning -resharper_redundant_overflow_checking_context_highlighting=warning -resharper_redundant_overload_global_highlighting=suggestion -resharper_redundant_overload_local_highlighting=suggestion -resharper_redundant_overridden_member_highlighting=warning -resharper_redundant_params_highlighting=warning -resharper_redundant_parentheses_highlighting=none -resharper_redundant_parent_type_declaration_highlighting=warning -resharper_redundant_pattern_parentheses_highlighting=hint -resharper_redundant_property_parentheses_highlighting=hint -resharper_redundant_property_pattern_clause_highlighting=suggestion -resharper_redundant_qualifier_highlighting=warning -resharper_redundant_query_order_by_ascending_keyword_highlighting=hint -resharper_redundant_range_bound_highlighting=suggestion -resharper_redundant_readonly_modifier_highlighting=suggestion -resharper_redundant_record_body_highlighting=warning -resharper_redundant_record_class_keyword_highlighting=warning -resharper_redundant_setter_value_parameter_declaration_highlighting=hint -resharper_redundant_space_highlighting=none -resharper_redundant_string_format_call_highlighting=warning -resharper_redundant_string_interpolation_highlighting=suggestion -resharper_redundant_string_to_char_array_call_highlighting=warning -resharper_redundant_string_type_highlighting=suggestion -resharper_redundant_suppress_nullable_warning_expression_highlighting=warning -resharper_redundant_ternary_expression_highlighting=warning -resharper_redundant_to_string_call_for_value_type_highlighting=hint -resharper_redundant_to_string_call_highlighting=warning -resharper_redundant_type_arguments_of_method_highlighting=warning -resharper_redundant_type_cast_highlighting=warning -resharper_redundant_type_cast_structural_highlighting=warning -resharper_redundant_type_check_in_pattern_highlighting=warning -resharper_redundant_units_highlighting=warning -resharper_redundant_unsafe_context_highlighting=warning -resharper_redundant_using_directive_global_highlighting=warning -resharper_redundant_using_directive_highlighting=warning -resharper_redundant_variable_type_specification_highlighting=hint -resharper_redundant_verbatim_prefix_highlighting=suggestion -resharper_redundant_verbatim_string_prefix_highlighting=suggestion -resharper_redundant_with_expression_highlighting=suggestion -resharper_reference_equals_with_value_type_highlighting=warning -resharper_reg_exp_inspections_highlighting=warning -resharper_remove_constructor_invocation_highlighting=none -resharper_remove_redundant_braces_highlighting=none -resharper_remove_redundant_or_statement_false_highlighting=suggestion -resharper_remove_redundant_or_statement_true_highlighting=suggestion -resharper_remove_to_list_1_highlighting=suggestion -resharper_remove_to_list_2_highlighting=suggestion -resharper_replace_auto_property_with_computed_property_highlighting=hint -resharper_replace_indicing_with_array_destructuring_highlighting=hint -resharper_replace_indicing_with_short_hand_properties_after_destructuring_highlighting=hint -resharper_replace_object_pattern_with_var_pattern_highlighting=suggestion -resharper_replace_slice_with_range_indexer_highlighting=hint -resharper_replace_substring_with_range_indexer_highlighting=hint -resharper_replace_undefined_checking_series_with_object_destructuring_highlighting=hint -resharper_replace_with_destructuring_swap_highlighting=hint -resharper_replace_with_first_or_default_1_highlighting=suggestion -resharper_replace_with_first_or_default_2_highlighting=suggestion -resharper_replace_with_first_or_default_3_highlighting=suggestion -resharper_replace_with_first_or_default_4_highlighting=suggestion -resharper_replace_with_last_or_default_1_highlighting=suggestion -resharper_replace_with_last_or_default_2_highlighting=suggestion -resharper_replace_with_last_or_default_3_highlighting=suggestion -resharper_replace_with_last_or_default_4_highlighting=suggestion -resharper_replace_with_of_type_1_highlighting=suggestion -resharper_replace_with_of_type_2_highlighting=suggestion -resharper_replace_with_of_type_3_highlighting=suggestion -resharper_replace_with_of_type_any_1_highlighting=suggestion -resharper_replace_with_of_type_any_2_highlighting=suggestion -resharper_replace_with_of_type_count_1_highlighting=suggestion -resharper_replace_with_of_type_count_2_highlighting=suggestion -resharper_replace_with_of_type_first_1_highlighting=suggestion -resharper_replace_with_of_type_first_2_highlighting=suggestion -resharper_replace_with_of_type_first_or_default_1_highlighting=suggestion -resharper_replace_with_of_type_first_or_default_2_highlighting=suggestion -resharper_replace_with_of_type_last_1_highlighting=suggestion -resharper_replace_with_of_type_last_2_highlighting=suggestion -resharper_replace_with_of_type_last_or_default_1_highlighting=suggestion -resharper_replace_with_of_type_last_or_default_2_highlighting=suggestion -resharper_replace_with_of_type_long_count_highlighting=suggestion -resharper_replace_with_of_type_single_1_highlighting=suggestion -resharper_replace_with_of_type_single_2_highlighting=suggestion -resharper_replace_with_of_type_single_or_default_1_highlighting=suggestion -resharper_replace_with_of_type_single_or_default_2_highlighting=suggestion -resharper_replace_with_of_type_where_highlighting=suggestion -resharper_replace_with_simple_assignment_false_highlighting=suggestion -resharper_replace_with_simple_assignment_true_highlighting=suggestion -resharper_replace_with_single_assignment_false_highlighting=suggestion -resharper_replace_with_single_assignment_true_highlighting=suggestion -resharper_replace_with_single_call_to_any_highlighting=suggestion -resharper_replace_with_single_call_to_count_highlighting=suggestion -resharper_replace_with_single_call_to_first_highlighting=suggestion -resharper_replace_with_single_call_to_first_or_default_highlighting=suggestion -resharper_replace_with_single_call_to_last_highlighting=suggestion -resharper_replace_with_single_call_to_last_or_default_highlighting=suggestion -resharper_replace_with_single_call_to_single_highlighting=suggestion -resharper_replace_with_single_call_to_single_or_default_highlighting=suggestion -resharper_replace_with_single_or_default_1_highlighting=suggestion -resharper_replace_with_single_or_default_2_highlighting=suggestion -resharper_replace_with_single_or_default_3_highlighting=suggestion -resharper_replace_with_single_or_default_4_highlighting=suggestion -resharper_replace_with_string_is_null_or_empty_highlighting=suggestion -resharper_required_base_types_conflict_highlighting=warning -resharper_required_base_types_direct_conflict_highlighting=warning -resharper_required_base_types_is_not_inherited_highlighting=warning -resharper_requires_fallback_color_highlighting=warning -resharper_resource_item_not_resolved_highlighting=error -resharper_resource_not_resolved_highlighting=error -resharper_resx_not_resolved_highlighting=warning -resharper_return_from_global_scopet_with_value_highlighting=warning -resharper_return_type_can_be_enumerable_global_highlighting=hint -resharper_return_type_can_be_enumerable_local_highlighting=hint -resharper_return_type_can_be_not_nullable_highlighting=warning -resharper_return_value_of_pure_method_is_not_used_highlighting=warning -resharper_route_templates_action_route_prefix_can_be_extracted_to_controller_route_highlighting=hint -resharper_route_templates_ambiguous_matching_constraint_constructor_highlighting=warning -resharper_route_templates_ambiguous_route_match_highlighting=warning -resharper_route_templates_constraint_argument_cannot_be_converted_highlighting=warning -resharper_route_templates_controller_route_parameter_is_not_passed_to_methods_highlighting=hint -resharper_route_templates_duplicated_parameter_highlighting=warning -resharper_route_templates_matching_constraint_constructor_not_resolved_highlighting=warning -resharper_route_templates_method_missing_route_parameters_highlighting=hint -resharper_route_templates_optional_parameter_can_be_preceded_only_by_single_period_highlighting=warning -resharper_route_templates_optional_parameter_must_be_at_the_end_of_segment_highlighting=warning -resharper_route_templates_parameter_constraint_can_be_specified_highlighting=hint -resharper_route_templates_parameter_type_and_constraints_mismatch_highlighting=warning -resharper_route_templates_parameter_type_can_be_made_stricter_highlighting=suggestion -resharper_route_templates_route_parameter_constraint_not_resolved_highlighting=warning -resharper_route_templates_route_parameter_is_not_passed_to_method_highlighting=hint -resharper_route_templates_route_token_not_resolved_highlighting=warning -resharper_route_templates_symbol_not_resolved_highlighting=warning -resharper_route_templates_syntax_error_highlighting=warning -resharper_safe_cast_is_used_as_type_check_highlighting=suggestion -resharper_same_imports_with_different_name_highlighting=warning -resharper_same_variable_assignment_highlighting=warning -resharper_script_tag_has_both_src_and_content_attributes_highlighting=error -resharper_script_tag_with_content_before_includes_highlighting=hint -resharper_sealed_member_in_sealed_class_highlighting=warning -resharper_separate_control_transfer_statement_highlighting=none -resharper_service_contract_without_operations_highlighting=warning -resharper_shift_expression_real_shift_count_is_zero_highlighting=warning -resharper_shift_expression_result_equals_zero_highlighting=warning -resharper_shift_expression_right_operand_not_equal_real_count_highlighting=warning -resharper_shift_expression_zero_left_operand_highlighting=warning -resharper_similar_anonymous_type_nearby_highlighting=hint -resharper_similar_expressions_comparison_highlighting=warning -resharper_simplify_conditional_operator_highlighting=suggestion -resharper_simplify_conditional_ternary_expression_highlighting=suggestion -resharper_simplify_i_if_highlighting=suggestion -resharper_simplify_linq_expression_use_all_highlighting=suggestion -resharper_simplify_linq_expression_use_any_highlighting=suggestion -resharper_simplify_string_interpolation_highlighting=suggestion -resharper_specify_a_culture_in_string_conversion_explicitly_highlighting=warning -resharper_specify_string_comparison_highlighting=hint -resharper_specify_variable_type_explicitly_highlighting=hint -resharper_spin_lock_in_readonly_field_highlighting=warning -resharper_stack_alloc_inside_loop_highlighting=warning -resharper_statement_termination_highlighting=warning -resharper_static_member_initializer_referes_to_member_below_highlighting=warning -resharper_static_member_in_generic_type_highlighting=none -resharper_static_problem_in_text_highlighting=warning -resharper_string_compare_is_culture_specific_1_highlighting=warning -resharper_string_compare_is_culture_specific_2_highlighting=warning -resharper_string_compare_is_culture_specific_3_highlighting=warning -resharper_string_compare_is_culture_specific_4_highlighting=warning -resharper_string_compare_is_culture_specific_5_highlighting=warning -resharper_string_compare_is_culture_specific_6_highlighting=warning -resharper_string_compare_to_is_culture_specific_highlighting=warning -resharper_string_concatenation_to_template_string_highlighting=hint -resharper_string_ends_with_is_culture_specific_highlighting=none -resharper_string_index_of_is_culture_specific_1_highlighting=warning -resharper_string_index_of_is_culture_specific_2_highlighting=warning -resharper_string_index_of_is_culture_specific_3_highlighting=warning -resharper_string_last_index_of_is_culture_specific_1_highlighting=warning -resharper_string_last_index_of_is_culture_specific_2_highlighting=warning -resharper_string_last_index_of_is_culture_specific_3_highlighting=warning -resharper_string_literal_as_interpolation_argument_highlighting=suggestion -resharper_string_literal_typo_highlighting=suggestion -resharper_string_literal_wrong_quotes_highlighting=hint -resharper_string_starts_with_is_culture_specific_highlighting=none -resharper_structured_message_template_problem_highlighting=warning -resharper_struct_can_be_made_read_only_highlighting=suggestion -resharper_struct_member_can_be_made_read_only_highlighting=none -resharper_suggest_base_type_for_parameter_highlighting=hint -resharper_suggest_base_type_for_parameter_in_constructor_highlighting=hint -resharper_suggest_discard_declaration_var_style_highlighting=hint -resharper_suggest_var_or_type_built_in_types_highlighting=hint -resharper_suggest_var_or_type_deconstruction_declarations_highlighting=hint -resharper_suggest_var_or_type_elsewhere_highlighting=hint -resharper_suggest_var_or_type_simple_types_highlighting=hint -resharper_super_call_highlighting=suggestion -resharper_super_call_prohibits_this_highlighting=error -resharper_suppress_nullable_warning_expression_as_inverted_is_expression_highlighting=warning -resharper_suspicious_instanceof_check_highlighting=warning -resharper_suspicious_lambda_block_highlighting=warning -resharper_suspicious_lock_over_synchronization_primitive_highlighting=warning -resharper_suspicious_math_sign_method_highlighting=warning -resharper_suspicious_parameter_name_in_argument_null_exception_highlighting=warning -resharper_suspicious_this_usage_highlighting=warning -resharper_suspicious_typeof_check_highlighting=warning -resharper_suspicious_type_conversion_global_highlighting=warning -resharper_swap_via_deconstruction_highlighting=suggestion -resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting=hint -resharper_switch_statement_for_enum_misses_default_section_highlighting=hint -resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting=hint -resharper_switch_statement_missing_some_enum_cases_no_default_highlighting=none -resharper_symbol_from_not_copied_locally_reference_used_warning_highlighting=warning -resharper_syntax_is_not_allowed_highlighting=warning -resharper_tabs_and_spaces_mismatch_highlighting=none -resharper_tabs_are_disallowed_highlighting=none -resharper_tabs_outside_indent_highlighting=none -resharper_tail_recursive_call_highlighting=hint -resharper_tasks_not_loaded_highlighting=warning -resharper_ternary_can_be_replaced_by_its_condition_highlighting=warning -resharper_this_in_global_context_highlighting=warning -resharper_thread_static_at_instance_field_highlighting=warning -resharper_thread_static_field_has_initializer_highlighting=warning -resharper_throw_must_be_followed_by_expression_highlighting=error -resharper_too_wide_local_variable_scope_highlighting=suggestion -resharper_try_cast_always_succeeds_highlighting=suggestion -resharper_try_statements_can_be_merged_highlighting=hint -resharper_ts_not_resolved_highlighting=error -resharper_ts_resolved_from_inaccessible_module_highlighting=error -resharper_type_guard_doesnt_affect_anything_highlighting=warning -resharper_type_guard_produces_never_type_highlighting=warning -resharper_type_parameter_can_be_variant_highlighting=suggestion -resharper_type_parameter_hides_type_param_from_outer_scope_highlighting=warning -resharper_ul_tag_contains_non_li_elements_highlighting=hint -resharper_unassigned_field_global_highlighting=suggestion -resharper_unassigned_field_local_highlighting=warning -resharper_unassigned_get_only_auto_property_highlighting=warning -resharper_unassigned_readonly_field_highlighting=warning -resharper_unclosed_script_highlighting=error -resharper_undeclared_global_variable_using_highlighting=warning -resharper_unexpected_value_highlighting=error -resharper_unknown_css_class_highlighting=warning -resharper_unknown_css_variable_highlighting=warning -resharper_unknown_css_vendor_extension_highlighting=hint -resharper_unknown_item_group_highlighting=warning -resharper_unknown_metadata_highlighting=warning -resharper_unknown_output_parameter_highlighting=warning -resharper_unknown_property_highlighting=warning -resharper_unknown_target_highlighting=warning -resharper_unknown_task_attribute_highlighting=warning -resharper_unknown_task_highlighting=warning -resharper_unnecessary_whitespace_highlighting=none -resharper_unreachable_switch_arm_due_to_integer_analysis_highlighting=warning -resharper_unreachable_switch_case_due_to_integer_analysis_highlighting=warning -resharper_unreal_header_tool_error_highlighting=error -resharper_unreal_header_tool_parser_error_highlighting=error -resharper_unreal_header_tool_warning_highlighting=warning -resharper_unsafe_comma_in_object_properties_list_highlighting=warning -resharper_unsupported_required_base_type_highlighting=warning -resharper_unused_anonymous_method_signature_highlighting=warning -resharper_unused_auto_property_accessor_global_highlighting=warning -resharper_unused_auto_property_accessor_local_highlighting=warning -resharper_unused_import_clause_highlighting=warning -resharper_unused_inherited_parameter_highlighting=hint -resharper_unused_locals_highlighting=warning -resharper_unused_local_function_highlighting=warning -resharper_unused_local_function_parameter_highlighting=warning -resharper_unused_local_function_return_value_highlighting=warning -resharper_unused_local_import_highlighting=warning -resharper_unused_member_global_highlighting=suggestion -resharper_unused_member_hierarchy_global_highlighting=suggestion -resharper_unused_member_hierarchy_local_highlighting=warning -resharper_unused_member_in_super_global_highlighting=suggestion -resharper_unused_member_in_super_local_highlighting=warning -resharper_unused_member_local_highlighting=warning -resharper_unused_method_return_value_global_highlighting=suggestion -resharper_unused_method_return_value_local_highlighting=warning -resharper_unused_parameter_global_highlighting=suggestion -resharper_unused_parameter_highlighting=warning -resharper_unused_parameter_in_partial_method_highlighting=warning -resharper_unused_parameter_local_highlighting=warning -resharper_unused_property_highlighting=warning -resharper_unused_tuple_component_in_return_value_highlighting=warning -resharper_unused_type_global_highlighting=suggestion -resharper_unused_type_local_highlighting=warning -resharper_unused_type_parameter_highlighting=warning -resharper_unused_variable_highlighting=warning -resharper_usage_of_definitely_unassigned_value_highlighting=warning -resharper_usage_of_possibly_unassigned_value_highlighting=warning -resharper_useless_binary_operation_highlighting=warning -resharper_useless_comparison_to_integral_constant_highlighting=warning -resharper_use_array_creation_expression_1_highlighting=suggestion -resharper_use_array_creation_expression_2_highlighting=suggestion -resharper_use_array_empty_method_highlighting=suggestion -resharper_use_as_instead_of_type_cast_highlighting=hint -resharper_use_await_using_highlighting=suggestion -resharper_use_cancellation_token_for_i_async_enumerable_highlighting=suggestion -resharper_use_collection_count_property_highlighting=suggestion -resharper_use_configure_await_false_for_async_disposable_highlighting=none -resharper_use_configure_await_false_highlighting=suggestion -resharper_use_deconstruction_highlighting=hint -resharper_use_deconstruction_on_parameter_highlighting=hint -resharper_use_empty_types_field_highlighting=suggestion -resharper_use_event_args_empty_field_highlighting=suggestion -resharper_use_format_specifier_in_format_string_highlighting=suggestion -resharper_use_implicitly_typed_variable_evident_highlighting=hint -resharper_use_implicitly_typed_variable_highlighting=none -resharper_use_implicit_by_val_modifier_highlighting=hint -resharper_use_indexed_property_highlighting=suggestion -resharper_use_index_from_end_expression_highlighting=suggestion -resharper_use_is_operator_1_highlighting=suggestion -resharper_use_is_operator_2_highlighting=suggestion -resharper_use_method_any_0_highlighting=suggestion -resharper_use_method_any_1_highlighting=suggestion -resharper_use_method_any_2_highlighting=suggestion -resharper_use_method_any_3_highlighting=suggestion -resharper_use_method_any_4_highlighting=suggestion -resharper_use_method_is_instance_of_type_highlighting=suggestion -resharper_use_nameof_expression_for_part_of_the_string_highlighting=none -resharper_use_nameof_expression_highlighting=suggestion -resharper_use_name_of_instead_of_type_of_highlighting=suggestion -resharper_use_negated_pattern_in_is_expression_highlighting=hint -resharper_use_negated_pattern_matching_highlighting=hint -resharper_use_nullable_annotation_instead_of_attribute_highlighting=suggestion -resharper_use_nullable_attributes_supported_by_compiler_highlighting=suggestion -resharper_use_nullable_reference_types_annotation_syntax_highlighting=warning -resharper_use_null_propagation_highlighting=hint -resharper_use_null_propagation_when_possible_highlighting=none -resharper_use_object_or_collection_initializer_highlighting=suggestion -resharper_use_of_implicit_global_in_function_scope_highlighting=warning -resharper_use_of_possibly_unassigned_property_highlighting=warning -resharper_use_pattern_matching_highlighting=suggestion -resharper_use_positional_deconstruction_pattern_highlighting=none -resharper_use_string_interpolation_highlighting=suggestion -resharper_use_switch_case_pattern_variable_highlighting=suggestion -resharper_use_throw_if_null_method_highlighting=none -resharper_use_verbatim_string_highlighting=hint -resharper_using_of_reserved_word_error_highlighting=error -resharper_using_of_reserved_word_highlighting=warning -resharper_value_parameter_not_used_highlighting=warning -resharper_value_range_attribute_violation_highlighting=warning -resharper_value_should_have_units_highlighting=error -resharper_variable_can_be_made_const_highlighting=hint -resharper_variable_can_be_made_let_highlighting=hint -resharper_variable_can_be_moved_to_inner_block_highlighting=hint -resharper_variable_can_be_not_nullable_highlighting=warning -resharper_variable_hides_outer_variable_highlighting=warning -resharper_variable_used_before_declared_highlighting=warning -resharper_variable_used_in_inner_scope_before_declared_highlighting=warning -resharper_variable_used_out_of_scope_highlighting=warning -resharper_vb_check_for_reference_equality_instead_1_highlighting=suggestion -resharper_vb_check_for_reference_equality_instead_2_highlighting=suggestion -resharper_vb_possible_mistaken_argument_highlighting=warning -resharper_vb_possible_mistaken_call_to_get_type_1_highlighting=warning -resharper_vb_possible_mistaken_call_to_get_type_2_highlighting=warning -resharper_vb_remove_to_list_1_highlighting=suggestion -resharper_vb_remove_to_list_2_highlighting=suggestion -resharper_vb_replace_with_first_or_default_highlighting=suggestion -resharper_vb_replace_with_last_or_default_highlighting=suggestion -resharper_vb_replace_with_of_type_1_highlighting=suggestion -resharper_vb_replace_with_of_type_2_highlighting=suggestion -resharper_vb_replace_with_of_type_any_1_highlighting=suggestion -resharper_vb_replace_with_of_type_any_2_highlighting=suggestion -resharper_vb_replace_with_of_type_count_1_highlighting=suggestion -resharper_vb_replace_with_of_type_count_2_highlighting=suggestion -resharper_vb_replace_with_of_type_first_1_highlighting=suggestion -resharper_vb_replace_with_of_type_first_2_highlighting=suggestion -resharper_vb_replace_with_of_type_first_or_default_1_highlighting=suggestion -resharper_vb_replace_with_of_type_first_or_default_2_highlighting=suggestion -resharper_vb_replace_with_of_type_last_1_highlighting=suggestion -resharper_vb_replace_with_of_type_last_2_highlighting=suggestion -resharper_vb_replace_with_of_type_last_or_default_1_highlighting=suggestion -resharper_vb_replace_with_of_type_last_or_default_2_highlighting=suggestion -resharper_vb_replace_with_of_type_single_1_highlighting=suggestion -resharper_vb_replace_with_of_type_single_2_highlighting=suggestion -resharper_vb_replace_with_of_type_single_or_default_1_highlighting=suggestion -resharper_vb_replace_with_of_type_single_or_default_2_highlighting=suggestion -resharper_vb_replace_with_of_type_where_highlighting=suggestion -resharper_vb_replace_with_single_assignment_1_highlighting=suggestion -resharper_vb_replace_with_single_assignment_2_highlighting=suggestion -resharper_vb_replace_with_single_call_to_any_highlighting=suggestion -resharper_vb_replace_with_single_call_to_count_highlighting=suggestion -resharper_vb_replace_with_single_call_to_first_highlighting=suggestion -resharper_vb_replace_with_single_call_to_first_or_default_highlighting=suggestion -resharper_vb_replace_with_single_call_to_last_highlighting=suggestion -resharper_vb_replace_with_single_call_to_last_or_default_highlighting=suggestion -resharper_vb_replace_with_single_call_to_single_highlighting=suggestion -resharper_vb_replace_with_single_call_to_single_or_default_highlighting=suggestion -resharper_vb_replace_with_single_or_default_highlighting=suggestion -resharper_vb_simplify_linq_expression_10_highlighting=hint -resharper_vb_simplify_linq_expression_1_highlighting=suggestion -resharper_vb_simplify_linq_expression_2_highlighting=suggestion -resharper_vb_simplify_linq_expression_3_highlighting=suggestion -resharper_vb_simplify_linq_expression_4_highlighting=suggestion -resharper_vb_simplify_linq_expression_5_highlighting=suggestion -resharper_vb_simplify_linq_expression_6_highlighting=suggestion -resharper_vb_simplify_linq_expression_7_highlighting=hint -resharper_vb_simplify_linq_expression_8_highlighting=hint -resharper_vb_simplify_linq_expression_9_highlighting=hint -resharper_vb_string_compare_is_culture_specific_1_highlighting=warning -resharper_vb_string_compare_is_culture_specific_2_highlighting=warning -resharper_vb_string_compare_is_culture_specific_3_highlighting=warning -resharper_vb_string_compare_is_culture_specific_4_highlighting=warning -resharper_vb_string_compare_is_culture_specific_5_highlighting=warning -resharper_vb_string_compare_is_culture_specific_6_highlighting=warning -resharper_vb_string_compare_to_is_culture_specific_highlighting=warning -resharper_vb_string_ends_with_is_culture_specific_highlighting=none -resharper_vb_string_index_of_is_culture_specific_1_highlighting=warning -resharper_vb_string_index_of_is_culture_specific_2_highlighting=warning -resharper_vb_string_index_of_is_culture_specific_3_highlighting=warning -resharper_vb_string_last_index_of_is_culture_specific_1_highlighting=warning -resharper_vb_string_last_index_of_is_culture_specific_2_highlighting=warning -resharper_vb_string_last_index_of_is_culture_specific_3_highlighting=warning -resharper_vb_string_starts_with_is_culture_specific_highlighting=none -resharper_vb_unreachable_code_highlighting=warning -resharper_vb_use_array_creation_expression_1_highlighting=suggestion -resharper_vb_use_array_creation_expression_2_highlighting=suggestion -resharper_vb_use_first_instead_highlighting=warning -resharper_vb_use_method_any_1_highlighting=suggestion -resharper_vb_use_method_any_2_highlighting=suggestion -resharper_vb_use_method_any_3_highlighting=suggestion -resharper_vb_use_method_any_4_highlighting=suggestion -resharper_vb_use_method_any_5_highlighting=suggestion -resharper_vb_use_method_is_instance_of_type_highlighting=suggestion -resharper_vb_use_type_of_is_operator_1_highlighting=suggestion -resharper_vb_use_type_of_is_operator_2_highlighting=suggestion -resharper_virtual_member_call_in_constructor_highlighting=warning -resharper_virtual_member_never_overridden_global_highlighting=suggestion -resharper_virtual_member_never_overridden_local_highlighting=suggestion -resharper_void_method_with_must_use_return_value_attribute_highlighting=warning -resharper_web_config_module_not_resolved_highlighting=error -resharper_web_config_module_qualification_resolve_highlighting=warning -resharper_web_config_redundant_add_namespace_tag_highlighting=warning -resharper_web_config_redundant_location_tag_highlighting=warning -resharper_web_config_tag_prefix_redundand_highlighting=warning -resharper_web_config_type_not_resolved_highlighting=error -resharper_web_config_unused_add_tag_highlighting=warning -resharper_web_config_unused_element_due_to_config_source_attribute_highlighting=warning -resharper_web_config_unused_remove_or_clear_tag_highlighting=warning -resharper_web_config_web_config_path_warning_highlighting=warning -resharper_web_config_wrong_module_highlighting=error -resharper_web_ignored_path_highlighting=none -resharper_web_mapped_path_highlighting=hint -resharper_with_expression_instead_of_initializer_highlighting=suggestion -resharper_with_statement_using_error_highlighting=error -resharper_wrong_expression_statement_highlighting=warning -resharper_wrong_indent_size_highlighting=none -resharper_wrong_metadata_use_highlighting=none -resharper_wrong_public_modifier_specification_highlighting=hint -resharper_wrong_require_relative_path_highlighting=hint -resharper_xaml_assign_null_to_not_null_attribute_highlighting=warning -resharper_xaml_avalonia_wrong_binding_mode_for_stream_binding_operator_highlighting=warning -resharper_xaml_binding_without_context_not_resolved_highlighting=hint -resharper_xaml_binding_with_context_not_resolved_highlighting=warning -resharper_xaml_compiled_binding_missing_data_type_error_highlighting_highlighting=error -resharper_xaml_constructor_warning_highlighting=warning -resharper_xaml_decimal_parsing_is_culture_dependent_highlighting=warning -resharper_xaml_dependency_property_resolve_error_highlighting=warning -resharper_xaml_duplicate_style_setter_highlighting=warning -resharper_xaml_dynamic_resource_error_highlighting=error -resharper_xaml_element_name_reference_not_resolved_highlighting=error -resharper_xaml_empty_grid_length_definition_highlighting=error -resharper_xaml_grid_definitions_can_be_converted_to_attribute_highlighting=hint -resharper_xaml_ignored_path_highlighting_highlighting=none -resharper_xaml_index_out_of_grid_definition_highlighting=warning -resharper_xaml_invalid_member_type_highlighting=error -resharper_xaml_invalid_resource_target_type_highlighting=error -resharper_xaml_invalid_resource_type_highlighting=error -resharper_xaml_invalid_type_highlighting=error -resharper_xaml_language_level_highlighting=error -resharper_xaml_mapped_path_highlighting_highlighting=hint -resharper_xaml_method_arguments_will_be_ignored_highlighting=warning -resharper_xaml_missing_grid_index_highlighting=warning -resharper_xaml_overloads_collision_highlighting=warning -resharper_xaml_parent_is_out_of_current_component_tree_highlighting=warning -resharper_xaml_path_error_highlighting=warning -resharper_xaml_possible_null_reference_exception_highlighting=suggestion -resharper_xaml_redundant_attached_property_highlighting=warning -resharper_xaml_redundant_binding_mode_attribute_highlighting=warning -resharper_xaml_redundant_collection_property_highlighting=warning -resharper_xaml_redundant_freeze_attribute_highlighting=warning -resharper_xaml_redundant_grid_definitions_highlighting=warning -resharper_xaml_redundant_grid_span_highlighting=warning -resharper_xaml_redundant_modifiers_attribute_highlighting=warning -resharper_xaml_redundant_namespace_alias_highlighting=warning -resharper_xaml_redundant_name_attribute_highlighting=warning -resharper_xaml_redundant_property_type_qualifier_highlighting=warning -resharper_xaml_redundant_resource_highlighting=warning -resharper_xaml_redundant_styled_value_highlighting=warning -resharper_xaml_redundant_update_source_trigger_attribute_highlighting=warning -resharper_xaml_redundant_xamarin_forms_class_declaration_highlighting=warning -resharper_xaml_resource_file_path_case_mismatch_highlighting=warning -resharper_xaml_routed_event_resolve_error_highlighting=warning -resharper_xaml_static_resource_not_resolved_highlighting=warning -resharper_xaml_style_class_not_found_highlighting=warning -resharper_xaml_style_invalid_target_type_highlighting=error -resharper_xaml_unexpected_text_token_highlighting=error -resharper_xaml_xaml_duplicate_device_family_type_view_highlighting_highlighting=error -resharper_xaml_xaml_mismatched_device_family_view_clr_name_highlighting_highlighting=warning -resharper_xaml_xaml_relative_source_default_mode_warning_highlighting_highlighting=warning -resharper_xaml_xaml_unknown_device_family_type_highlighting_highlighting=warning -resharper_xaml_xaml_xamarin_forms_data_type_and_binding_context_type_mismatched_highlighting_highlighting=warning -resharper_xaml_x_key_attribute_disallowed_highlighting=error -resharper_xml_doc_comment_syntax_problem_highlighting=warning -resharper_xunit_xunit_test_with_console_output_highlighting=warning -csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion -csharp_style_expression_bodied_methods = true:silent -csharp_style_prefer_tuple_swap = true:suggestion -csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion -csharp_style_prefer_utf8_string_literals = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -csharp_style_expression_bodied_constructors = true:silent -csharp_style_expression_bodied_operators = true:silent -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_style_expression_bodied_properties = true:silent -csharp_prefer_simple_using_statement = true:suggestion -csharp_prefer_braces = true:silent -csharp_style_prefer_method_group_conversion = true:silent -csharp_style_prefer_top_level_statements = true:silent -csharp_style_prefer_primary_constructors = true:suggestion -csharp_prefer_system_threading_lock = true:suggestion -csharp_style_prefer_simple_property_accessors = true:suggestion -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_local_functions = false:silent -csharp_style_throw_expression = true:suggestion -csharp_style_prefer_null_check_over_type_check = true:suggestion -csharp_style_prefer_local_over_anonymous_function = true:suggestion -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_prefer_range_operator = true:suggestion -csharp_style_prefer_index_operator = true:suggestion -csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion -csharp_prefer_static_local_function = true:suggestion -csharp_style_prefer_readonly_struct = true:suggestion -csharp_prefer_static_anonymous_function = true:suggestion -csharp_style_prefer_readonly_struct_member = true:suggestion -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent -csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent -csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent -csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_prefer_switch_expression = true:suggestion -csharp_style_prefer_pattern_matching = true:silent -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_prefer_not_pattern = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_prefer_extended_property_pattern = true:suggestion - -[*.{cshtml,htm,html,proto,razor}] -indent_style=tab -indent_size=tab -tab_width=4 - -[*.{asax,ascx,aspx,axaml,c,c++,cc,cginc,compute,cp,cpp,cs,css,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,js,jsx,master,mpp,mq4,mq5,mqh,paml,skin,tpp,ts,tsx,usf,ush,vb,xaml,xamlx,xoml}] -indent_style=space -indent_size=4 -tab_width=4 - -[ "*.proto" ] -indent_style=tab -indent_size=tab -tab_width=4 - -[*.{asax,ascx,aspx,axaml,cs,cshtml,css,htm,html,js,jsx,master,paml,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}] -indent_style=space -indent_size=4 -tab_width=4 - -[*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}] -indent_style=space -indent_size=2 -tab_width=2 - -[*.{appxmanifest,asax,ascx,aspx,axaml,axml,build,c,c++,cc,cginc,compute,config,cp,cpp,cs,cshtml,csproj,css,cu,cuh,cxx,dbml,discomap,dtd,h,hh,hlsl,hlsli,hlslinc,hpp,htm,html,hxx,inc,inl,ino,ipp,js,json,jsproj,jsx,lsproj,master,mpp,mq4,mq5,mqh,njsproj,nuspec,paml,proj,props,proto,razor,resjson,resw,resx,skin,StyleCop,targets,tasks,tpp,ts,tsx,usf,ush,vb,vbproj,xaml,xamlx,xml,xoml,xsd}] -indent_style=space -indent_size= 4 -tab_width= 4 -dotnet_style_operator_placement_when_wrapping = beginning_of_line -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_auto_properties = true:silent -dotnet_style_object_initializer = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_prefer_simplified_boolean_expressions = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_prefer_simplified_interpolation = true:suggestion -dotnet_style_namespace_match_folder = true:suggestion -insert_final_newline = true -end_of_line = lf -dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion -dotnet_style_readonly_field = true:suggestion -dotnet_style_allow_statement_immediately_after_block_experimental = true:silent -dotnet_style_allow_multiple_blank_lines_experimental = true:silent -dotnet_code_quality_unused_parameters = all:suggestion -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +# Standard properties +csharp_indent_labels = one_less_than_current +# Microsoft .NET properties +csharp_indent_braces=false +csharp_indent_switch_labels=true +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_open_brace=all +csharp_new_line_between_query_expression_clauses=true +csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion +csharp_preserve_single_line_blocks=true +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_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 +csharp_style_namespace_declarations= file_scoped:suggestion +csharp_style_var_elsewhere= true:suggestion +csharp_style_var_for_built_in_types= true:suggestion +csharp_style_var_when_type_is_apparent= true:suggestion +csharp_using_directive_placement= outside_namespace:silent +dotnet_diagnostic.bc40000.severity=warning +dotnet_diagnostic.bc400005.severity=warning +dotnet_diagnostic.bc40008.severity=warning +dotnet_diagnostic.bc40056.severity=warning +dotnet_diagnostic.bc42016.severity=warning +dotnet_diagnostic.bc42024.severity=warning +dotnet_diagnostic.bc42025.severity=warning +dotnet_diagnostic.bc42104.severity=warning +dotnet_diagnostic.bc42105.severity=warning +dotnet_diagnostic.bc42106.severity=warning +dotnet_diagnostic.bc42107.severity=warning +dotnet_diagnostic.bc42304.severity=warning +dotnet_diagnostic.bc42309.severity=warning +dotnet_diagnostic.bc42322.severity=warning +dotnet_diagnostic.bc42349.severity=warning +dotnet_diagnostic.bc42353.severity=warning +dotnet_diagnostic.bc42354.severity=warning +dotnet_diagnostic.bc42355.severity=warning +dotnet_diagnostic.bc42356.severity=warning +dotnet_diagnostic.bc42358.severity=warning +dotnet_diagnostic.bc42504.severity=warning +dotnet_diagnostic.bc42505.severity=warning +dotnet_diagnostic.cs0067.severity=warning +dotnet_diagnostic.cs0078.severity=warning +dotnet_diagnostic.cs0108.severity=warning +dotnet_diagnostic.cs0109.severity=warning +dotnet_diagnostic.cs0114.severity=warning +dotnet_diagnostic.cs0162.severity=warning +dotnet_diagnostic.cs0164.severity=warning +dotnet_diagnostic.cs0168.severity=warning +dotnet_diagnostic.cs0169.severity=warning +dotnet_diagnostic.cs0183.severity=warning +dotnet_diagnostic.cs0184.severity=warning +dotnet_diagnostic.cs0197.severity=warning +dotnet_diagnostic.cs0219.severity=warning +dotnet_diagnostic.cs0252.severity=warning +dotnet_diagnostic.cs0253.severity=warning +dotnet_diagnostic.cs0414.severity=warning +dotnet_diagnostic.cs0420.severity=warning +dotnet_diagnostic.cs0465.severity=warning +dotnet_diagnostic.cs0469.severity=warning +dotnet_diagnostic.cs0612.severity=warning +dotnet_diagnostic.cs0618.severity=warning +dotnet_diagnostic.cs0628.severity=warning +dotnet_diagnostic.cs0642.severity=warning +dotnet_diagnostic.cs0649.severity=warning +dotnet_diagnostic.cs0652.severity=warning +dotnet_diagnostic.cs0657.severity=warning +dotnet_diagnostic.cs0658.severity=warning +dotnet_diagnostic.cs0659.severity=warning +dotnet_diagnostic.cs0660.severity=warning +dotnet_diagnostic.cs0661.severity=warning +dotnet_diagnostic.cs0665.severity=warning +dotnet_diagnostic.cs0672.severity=warning +dotnet_diagnostic.cs0675.severity=warning +dotnet_diagnostic.cs0693.severity=warning +dotnet_diagnostic.cs1030.severity=warning +dotnet_diagnostic.cs1058.severity=warning +dotnet_diagnostic.cs1066.severity=warning +dotnet_diagnostic.cs1522.severity=warning +dotnet_diagnostic.cs1570.severity=warning +dotnet_diagnostic.cs1571.severity=warning +dotnet_diagnostic.cs1572.severity=warning +dotnet_diagnostic.cs1573.severity=warning +dotnet_diagnostic.cs1574.severity=warning +dotnet_diagnostic.cs1580.severity=warning +dotnet_diagnostic.cs1581.severity=warning +dotnet_diagnostic.cs1584.severity=warning +dotnet_diagnostic.cs1587.severity=warning +dotnet_diagnostic.cs1589.severity=warning +dotnet_diagnostic.cs1590.severity=warning +dotnet_diagnostic.cs1591.severity=warning +dotnet_diagnostic.cs1592.severity=warning +dotnet_diagnostic.cs1710.severity=warning +dotnet_diagnostic.cs1711.severity=warning +dotnet_diagnostic.cs1712.severity=warning +dotnet_diagnostic.cs1717.severity=warning +dotnet_diagnostic.cs1723.severity=warning +dotnet_diagnostic.cs1911.severity=warning +dotnet_diagnostic.cs1957.severity=warning +dotnet_diagnostic.cs1981.severity=warning +dotnet_diagnostic.cs1998.severity=warning +dotnet_diagnostic.cs4014.severity=warning +dotnet_diagnostic.cs7022.severity=warning +dotnet_diagnostic.cs7023.severity=warning +dotnet_diagnostic.cs7095.severity=warning +dotnet_diagnostic.cs8094.severity=warning +dotnet_diagnostic.cs8123.severity=warning +dotnet_diagnostic.cs8321.severity=warning +dotnet_diagnostic.cs8383.severity=warning +dotnet_diagnostic.cs8416.severity=warning +dotnet_diagnostic.cs8417.severity=warning +dotnet_diagnostic.cs8424.severity=warning +dotnet_diagnostic.cs8425.severity=warning +dotnet_diagnostic.cs8509.severity=warning +dotnet_diagnostic.cs8524.severity=warning +dotnet_diagnostic.cs8597.severity=warning +dotnet_diagnostic.cs8600.severity=warning +dotnet_diagnostic.cs8601.severity=warning +dotnet_diagnostic.cs8602.severity=warning +dotnet_diagnostic.cs8603.severity=warning +dotnet_diagnostic.cs8604.severity=warning +dotnet_diagnostic.cs8605.severity=warning +dotnet_diagnostic.cs8607.severity=warning +dotnet_diagnostic.cs8608.severity=warning +dotnet_diagnostic.cs8609.severity=warning +dotnet_diagnostic.cs8610.severity=warning +dotnet_diagnostic.cs8611.severity=warning +dotnet_diagnostic.cs8612.severity=warning +dotnet_diagnostic.cs8613.severity=warning +dotnet_diagnostic.cs8614.severity=warning +dotnet_diagnostic.cs8615.severity=warning +dotnet_diagnostic.cs8616.severity=warning +dotnet_diagnostic.cs8617.severity=warning +dotnet_diagnostic.cs8618.severity=warning +dotnet_diagnostic.cs8619.severity=warning +dotnet_diagnostic.cs8620.severity=warning +dotnet_diagnostic.cs8621.severity=warning +dotnet_diagnostic.cs8622.severity=warning +dotnet_diagnostic.cs8624.severity=warning +dotnet_diagnostic.cs8625.severity=warning +dotnet_diagnostic.cs8629.severity=warning +dotnet_diagnostic.cs8631.severity=warning +dotnet_diagnostic.cs8632.severity=none +dotnet_diagnostic.cs8633.severity=warning +dotnet_diagnostic.cs8634.severity=warning +dotnet_diagnostic.cs8643.severity=warning +dotnet_diagnostic.cs8644.severity=warning +dotnet_diagnostic.cs8645.severity=warning +dotnet_diagnostic.cs8655.severity=warning +dotnet_diagnostic.cs8656.severity=warning +dotnet_diagnostic.cs8667.severity=warning +dotnet_diagnostic.cs8669.severity=none +dotnet_diagnostic.cs8670.severity=warning +dotnet_diagnostic.cs8714.severity=warning +dotnet_diagnostic.cs8762.severity=warning +dotnet_diagnostic.cs8763.severity=warning +dotnet_diagnostic.cs8764.severity=warning +dotnet_diagnostic.cs8765.severity=warning +dotnet_diagnostic.cs8766.severity=warning +dotnet_diagnostic.cs8767.severity=warning +dotnet_diagnostic.cs8768.severity=warning +dotnet_diagnostic.cs8769.severity=warning +dotnet_diagnostic.cs8770.severity=warning +dotnet_diagnostic.cs8774.severity=warning +dotnet_diagnostic.cs8775.severity=warning +dotnet_diagnostic.cs8776.severity=warning +dotnet_diagnostic.cs8777.severity=warning +dotnet_diagnostic.cs8794.severity=warning +dotnet_diagnostic.cs8819.severity=warning +dotnet_diagnostic.cs8824.severity=warning +dotnet_diagnostic.cs8825.severity=warning +dotnet_diagnostic.cs8846.severity=warning +dotnet_diagnostic.cs8847.severity=warning +dotnet_diagnostic.cs8851.severity=warning +dotnet_diagnostic.cs8860.severity=warning +dotnet_diagnostic.cs8892.severity=warning +dotnet_diagnostic.cs8907.severity=warning +dotnet_diagnostic.cs8947.severity=warning +dotnet_diagnostic.cs8960.severity=warning +dotnet_diagnostic.cs8961.severity=warning +dotnet_diagnostic.cs8962.severity=warning +dotnet_diagnostic.cs8963.severity=warning +dotnet_diagnostic.cs8965.severity=warning +dotnet_diagnostic.cs8966.severity=warning +dotnet_diagnostic.cs8971.severity=warning +dotnet_diagnostic.wme006.severity=warning +dotnet_naming_rule.constants_rule.import_to_resharper=as_predefined +dotnet_naming_rule.constants_rule.severity = warning +dotnet_naming_rule.constants_rule.style = upper_camel_case_style +dotnet_naming_rule.constants_rule.symbols=constants_symbols +dotnet_naming_rule.event_rule.import_to_resharper=as_predefined +dotnet_naming_rule.event_rule.severity = warning +dotnet_naming_rule.event_rule.style = upper_camel_case_style +dotnet_naming_rule.event_rule.symbols=event_symbols +dotnet_naming_rule.interfaces_rule.import_to_resharper=as_predefined +dotnet_naming_rule.interfaces_rule.severity = warning +dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style +dotnet_naming_rule.interfaces_rule.symbols=interfaces_symbols +dotnet_naming_rule.locals_rule.import_to_resharper=as_predefined +dotnet_naming_rule.locals_rule.severity = warning +dotnet_naming_rule.locals_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.locals_rule.symbols=locals_symbols +dotnet_naming_rule.local_constants_rule.import_to_resharper=as_predefined +dotnet_naming_rule.local_constants_rule.severity = warning +dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.local_constants_rule.symbols=local_constants_symbols +dotnet_naming_rule.local_functions_rule.import_to_resharper=as_predefined +dotnet_naming_rule.local_functions_rule.severity = warning +dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style +dotnet_naming_rule.local_functions_rule.symbols=local_functions_symbols +dotnet_naming_rule.method_rule.import_to_resharper=as_predefined +dotnet_naming_rule.method_rule.severity = warning +dotnet_naming_rule.method_rule.style = upper_camel_case_style +dotnet_naming_rule.method_rule.symbols=method_symbols +dotnet_naming_rule.parameters_rule.import_to_resharper=as_predefined +dotnet_naming_rule.parameters_rule.severity = warning +dotnet_naming_rule.parameters_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.parameters_rule.symbols=parameters_symbols +dotnet_naming_rule.private_constants_rule.import_to_resharper=as_predefined +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style +dotnet_naming_rule.private_constants_rule.symbols=private_constants_symbols +dotnet_naming_rule.private_instance_fields_rule.import_to_resharper=as_predefined +dotnet_naming_rule.private_instance_fields_rule.severity = warning +dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_instance_fields_rule.symbols=private_instance_fields_symbols +dotnet_naming_rule.private_static_fields_rule.import_to_resharper=as_predefined +dotnet_naming_rule.private_static_fields_rule.severity = warning +dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_fields_rule.symbols=private_static_fields_symbols +dotnet_naming_rule.private_static_readonly_rule.import_to_resharper=as_predefined +dotnet_naming_rule.private_static_readonly_rule.severity = warning +dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.private_static_readonly_rule.symbols=private_static_readonly_symbols +dotnet_naming_rule.property_rule.import_to_resharper=as_predefined +dotnet_naming_rule.property_rule.severity = warning +dotnet_naming_rule.property_rule.style = upper_camel_case_style +dotnet_naming_rule.property_rule.symbols=property_symbols +dotnet_naming_rule.public_fields_rule.import_to_resharper=as_predefined +dotnet_naming_rule.public_fields_rule.severity = warning +dotnet_naming_rule.public_fields_rule.style = upper_camel_case_style +dotnet_naming_rule.public_fields_rule.symbols=public_fields_symbols +dotnet_naming_rule.static_readonly_rule.import_to_resharper=as_predefined +dotnet_naming_rule.static_readonly_rule.severity = warning +dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.static_readonly_rule.symbols=static_readonly_symbols +dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper=as_predefined +dotnet_naming_rule.types_and_namespaces_rule.severity = warning +dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style +dotnet_naming_rule.types_and_namespaces_rule.symbols=types_and_namespaces_symbols +dotnet_naming_rule.type_parameters_rule.import_to_resharper=as_predefined +dotnet_naming_rule.type_parameters_rule.severity = warning +dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style +dotnet_naming_rule.type_parameters_rule.symbols=type_parameters_symbols +dotnet_naming_style.i_upper_camel_case_style.capitalization=pascal_case +dotnet_naming_style.i_upper_camel_case_style.required_prefix=I +dotnet_naming_style.lower_camel_case_style.capitalization=camel_case +dotnet_naming_style.lower_camel_case_style.required_prefix=_ +dotnet_naming_style.lower_camel_case_style_1.capitalization=camel_case +dotnet_naming_style.t_upper_camel_case_style.capitalization=pascal_case +dotnet_naming_style.t_upper_camel_case_style.required_prefix=T +dotnet_naming_style.upper_camel_case_style.capitalization=pascal_case +dotnet_naming_symbols.constants_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.constants_symbols.applicable_kinds=field +dotnet_naming_symbols.constants_symbols.required_modifiers=const +dotnet_naming_symbols.event_symbols.applicable_accessibilities=* +dotnet_naming_symbols.event_symbols.applicable_kinds=event +dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities=* +dotnet_naming_symbols.interfaces_symbols.applicable_kinds=interface +dotnet_naming_symbols.locals_symbols.applicable_accessibilities=* +dotnet_naming_symbols.locals_symbols.applicable_kinds=local +dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities=* +dotnet_naming_symbols.local_constants_symbols.applicable_kinds=local +dotnet_naming_symbols.local_constants_symbols.required_modifiers=const +dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities=* +dotnet_naming_symbols.local_functions_symbols.applicable_kinds=local_function +dotnet_naming_symbols.method_symbols.applicable_accessibilities=* +dotnet_naming_symbols.method_symbols.applicable_kinds=method +dotnet_naming_symbols.parameters_symbols.applicable_accessibilities=* +dotnet_naming_symbols.parameters_symbols.applicable_kinds=parameter +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities=private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds=field +dotnet_naming_symbols.private_constants_symbols.required_modifiers=const +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities=private +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds=field +dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities=private +dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds=field +dotnet_naming_symbols.private_static_fields_symbols.required_modifiers=static +dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities=private +dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds=field +dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers=static,readonly +dotnet_naming_symbols.property_symbols.applicable_accessibilities=* +dotnet_naming_symbols.property_symbols.applicable_kinds=property +dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.public_fields_symbols.applicable_kinds=field +dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.static_readonly_symbols.applicable_kinds=field +dotnet_naming_symbols.static_readonly_symbols.required_modifiers=static,readonly +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities=* +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds=namespace,class,struct,enum,delegate +dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities=* +dotnet_naming_symbols.type_parameters_symbols.applicable_kinds=type_parameter +dotnet_separate_import_directive_groups=false +dotnet_sort_system_directives_first=true +dotnet_style_parentheses_in_arithmetic_binary_operators= never_if_unnecessary:suggestion +dotnet_style_parentheses_in_other_binary_operators= never_if_unnecessary:suggestion +dotnet_style_parentheses_in_relational_binary_operators= never_if_unnecessary:suggestion +dotnet_style_predefined_type_for_locals_parameters_members= true:suggestion +dotnet_style_predefined_type_for_member_access= true:suggestion +dotnet_style_qualification_for_event= false:suggestion +dotnet_style_qualification_for_field= false:suggestion +dotnet_style_qualification_for_method= false:suggestion +dotnet_style_qualification_for_property= false:suggestion +dotnet_style_require_accessibility_modifiers= always:suggestion +file_header_template= + +# ReSharper properties +resharper_accessor_owner_body=expression_body +resharper_alignment_tab_fill_style=use_spaces +resharper_align_first_arg_by_paren=false +resharper_align_linq_query=false +resharper_align_multiline_argument=true +resharper_align_multiline_array_and_object_initializer=false +resharper_align_multiline_array_initializer=true +resharper_align_multiline_binary_expressions_chain=false +resharper_align_multiline_binary_patterns=false +resharper_align_multiline_ctor_init=true +resharper_align_multiline_expression_braces=false +resharper_align_multiline_implements_list=true +resharper_align_multiline_property_pattern=false +resharper_align_multiline_statement_conditions=true +resharper_align_multiline_switch_expression=false +resharper_align_multiline_type_argument=true +resharper_align_multiline_type_parameter=true +resharper_align_multline_type_parameter_constrains=true +resharper_align_multline_type_parameter_list=false +resharper_align_tuple_components=false +resharper_align_union_type_usage=true +resharper_allow_alias=true +resharper_allow_comment_after_lbrace=false +resharper_allow_far_alignment=false +resharper_always_use_end_of_line_brace_style=false +resharper_apply_auto_detected_rules=false +resharper_apply_on_completion=false +resharper_arguments_anonymous_function=positional +resharper_arguments_literal=positional +resharper_arguments_named=positional +resharper_arguments_other=positional +resharper_arguments_skip_single=false +resharper_arguments_string_literal=positional +resharper_attribute_style=do_not_touch +resharper_autodetect_indent_settings=false +resharper_blank_lines_after_block_statements=1 +resharper_blank_lines_after_case=0 +resharper_blank_lines_after_control_transfer_statements=1 +resharper_blank_lines_after_file_scoped_namespace_directive=1 +resharper_blank_lines_after_imports=1 +resharper_blank_lines_after_multiline_statements=0 +resharper_blank_lines_after_options=1 +resharper_blank_lines_after_start_comment=1 +resharper_blank_lines_after_using_list=1 +resharper_blank_lines_around_accessor=0 +resharper_blank_lines_around_auto_property=1 +resharper_blank_lines_around_block_case_section=0 +resharper_blank_lines_around_class_definition=1 +resharper_blank_lines_around_field=1 +resharper_blank_lines_around_function_declaration=0 +resharper_blank_lines_around_function_definition=1 +resharper_blank_lines_around_global_attribute=0 +resharper_blank_lines_around_invocable=1 +resharper_blank_lines_around_local_method=1 +resharper_blank_lines_around_multiline_case_section=0 +resharper_blank_lines_around_namespace=1 +resharper_blank_lines_around_other_declaration=0 +resharper_blank_lines_around_property=1 +resharper_blank_lines_around_razor_functions=1 +resharper_blank_lines_around_razor_helpers=1 +resharper_blank_lines_around_razor_sections=1 +resharper_blank_lines_around_region=1 +resharper_blank_lines_around_single_line_accessor=0 +resharper_blank_lines_around_single_line_auto_property=0 +resharper_blank_lines_around_single_line_field=0 +resharper_blank_lines_around_single_line_function_definition=0 +resharper_blank_lines_around_single_line_invocable=0 +resharper_blank_lines_around_single_line_local_method=0 +resharper_blank_lines_around_single_line_property=0 +resharper_blank_lines_around_single_line_type=0 +resharper_blank_lines_around_type=1 +resharper_blank_lines_before_block_statements=0 +resharper_blank_lines_before_case=0 +resharper_blank_lines_before_control_transfer_statements=0 +resharper_blank_lines_before_multiline_statements=0 +resharper_blank_lines_before_single_line_comment=0 +resharper_blank_lines_inside_namespace=0 +resharper_blank_lines_inside_region=1 +resharper_blank_lines_inside_type=0 +resharper_blank_line_after_pi=true +resharper_braces_for_dowhile=required +resharper_braces_for_fixed=required +resharper_braces_for_for=required_for_multiline +resharper_braces_for_foreach=required_for_multiline +resharper_braces_for_ifelse=not_required_for_both +resharper_braces_for_lock=required +resharper_braces_for_using=required +resharper_braces_for_while=required_for_multiline +resharper_braces_redundant=true +resharper_break_template_declaration=line_break +resharper_can_use_global_alias=true +resharper_configure_await_analysis_mode=disabled +resharper_constructor_or_destructor_body=expression_body +resharper_continuous_indent_multiplier=1 +resharper_continuous_line_indent=single +resharper_cpp_align_multiline_argument=true +resharper_cpp_align_multiline_calls_chain=true +resharper_cpp_align_multiline_extends_list=true +resharper_cpp_align_multiline_for_stmt=true +resharper_cpp_align_multiline_parameter=true +resharper_cpp_align_multiple_declaration=true +resharper_cpp_align_ternary=align_not_nested +resharper_cpp_anonymous_method_declaration_braces=next_line +resharper_cpp_case_block_braces=next_line_shifted_2 +resharper_cpp_empty_block_style=multiline +resharper_cpp_indent_switch_labels=false +resharper_cpp_insert_final_newline=false +resharper_cpp_int_align_comments=false +resharper_cpp_invocable_declaration_braces=next_line +resharper_cpp_max_line_length=120 +resharper_cpp_new_line_before_catch=true +resharper_cpp_new_line_before_else=true +resharper_cpp_new_line_before_while=true +resharper_cpp_other_braces=next_line +resharper_cpp_space_around_binary_operator=true +resharper_cpp_type_declaration_braces=next_line +resharper_cpp_wrap_arguments_style=wrap_if_long +resharper_cpp_wrap_lines=true +resharper_cpp_wrap_parameters_style=wrap_if_long +resharper_csharp_align_multiline_argument=false +resharper_csharp_align_multiline_calls_chain=false +resharper_csharp_align_multiline_expression=false +resharper_csharp_align_multiline_extends_list=false +resharper_csharp_align_multiline_for_stmt=false +resharper_csharp_align_multiline_parameter=false +resharper_csharp_align_multiple_declaration=true +resharper_csharp_empty_block_style=together +resharper_csharp_insert_final_newline=true +resharper_csharp_int_align_comments=true +resharper_csharp_max_line_length=144 +resharper_csharp_naming_rule.enum_member=AaBb +resharper_csharp_naming_rule.method_property_event=AaBb +resharper_csharp_naming_rule.other=AaBb +resharper_csharp_new_line_before_while=false +resharper_csharp_prefer_qualified_reference=false +resharper_csharp_space_after_unary_operator=false +resharper_csharp_wrap_arguments_style=wrap_if_long +resharper_csharp_wrap_before_binary_opsign=true +resharper_csharp_wrap_for_stmt_header_style=wrap_if_long +resharper_csharp_wrap_lines=true +resharper_csharp_wrap_parameters_style=wrap_if_long +resharper_css_brace_style=end_of_line +resharper_css_insert_final_newline=false +resharper_css_keep_blank_lines_between_declarations=1 +resharper_css_max_line_length=120 +resharper_css_wrap_lines=true +resharper_cxxcli_property_declaration_braces=next_line +resharper_declarations_style=separate_lines +resharper_default_exception_variable_name=e +resharper_default_value_when_type_evident=default_literal +resharper_default_value_when_type_not_evident=default_literal +resharper_delete_quotes_from_solid_values=false +resharper_disable_blank_line_changes=false +resharper_disable_formatter=false +resharper_disable_indenter=false +resharper_disable_int_align=false +resharper_disable_line_break_changes=false +resharper_disable_line_break_removal=false +resharper_disable_space_changes=false +resharper_disable_space_changes_before_trailing_comment=false +resharper_dont_remove_extra_blank_lines=false +resharper_enable_wrapping=false +resharper_enforce_line_ending_style=false +resharper_event_handler_pattern_long=$object$On$event$ +resharper_event_handler_pattern_short=On$event$ +resharper_expression_braces=inside +resharper_expression_pars=inside +resharper_extra_spaces=remove_all +resharper_force_attribute_style=separate +resharper_force_chop_compound_do_expression=false +resharper_force_chop_compound_if_expression=false +resharper_force_chop_compound_while_expression=false +resharper_force_control_statements_braces=do_not_change +resharper_force_linebreaks_inside_complex_literals=true +resharper_force_variable_declarations_on_new_line=false +resharper_format_leading_spaces_decl=false +resharper_free_block_braces=next_line +resharper_function_declaration_return_type_style=do_not_change +resharper_function_definition_return_type_style=do_not_change +resharper_generator_mode=false +resharper_html_attribute_indent=align_by_first_attribute +resharper_html_insert_final_newline=false +resharper_html_linebreak_before_elements=body,div,p,form,h1,h2,h3 +resharper_html_max_blank_lines_between_tags=2 +resharper_html_max_line_length=120 +resharper_html_pi_attribute_style=on_single_line +resharper_html_space_before_self_closing=false +resharper_html_wrap_lines=true +resharper_ignore_space_preservation=false +resharper_include_prefix_comment_in_indent=false +resharper_indent_access_specifiers_from_class=false +resharper_indent_aligned_ternary=true +resharper_indent_anonymous_method_block=false +resharper_indent_braces_inside_statement_conditions=true +resharper_indent_case_from_select=true +resharper_indent_child_elements=OneIndent +resharper_indent_class_members_from_access_specifiers=false +resharper_indent_comment=true +resharper_indent_inside_namespace=true +resharper_indent_invocation_pars=inside +resharper_indent_left_par_inside_expression=false +resharper_indent_method_decl_pars=inside +resharper_indent_nested_fixed_stmt=false +resharper_indent_nested_foreach_stmt=true +resharper_indent_nested_for_stmt=true +resharper_indent_nested_lock_stmt=false +resharper_indent_nested_usings_stmt=false +resharper_indent_nested_while_stmt=true +resharper_indent_pars=inside +resharper_indent_preprocessor_directives=none +resharper_indent_preprocessor_if=no_indent +resharper_indent_preprocessor_other=no_indent +resharper_indent_preprocessor_region=usual_indent +resharper_indent_statement_pars=inside +resharper_indent_text=OneIndent +resharper_indent_typearg_angles=inside +resharper_indent_typeparam_angles=inside +resharper_indent_type_constraints=true +resharper_indent_wrapped_function_names=false +resharper_instance_members_qualify_declared_in=this_class, base_class +resharper_int_align=true +resharper_int_align_assignments=true +resharper_int_align_binary_expressions=false +resharper_int_align_declaration_names=false +resharper_int_align_eq=false +resharper_int_align_fields=true +resharper_int_align_fix_in_adjacent=true +resharper_int_align_invocations=true +resharper_int_align_methods=true +resharper_int_align_nested_ternary=true +resharper_int_align_parameters=false +resharper_int_align_properties=true +resharper_int_align_property_patterns=true +resharper_int_align_switch_expressions=true +resharper_int_align_switch_sections=true +resharper_int_align_variables=true +resharper_js_align_multiline_parameter=false +resharper_js_align_multiple_declaration=false +resharper_js_align_ternary=none +resharper_js_brace_style=end_of_line +resharper_js_empty_block_style=multiline +resharper_js_indent_switch_labels=false +resharper_js_insert_final_newline=false +resharper_js_keep_blank_lines_between_declarations=2 +resharper_js_max_line_length=120 +resharper_js_new_line_before_catch=false +resharper_js_new_line_before_else=false +resharper_js_new_line_before_finally=false +resharper_js_new_line_before_while=false +resharper_js_space_around_binary_operator=true +resharper_js_wrap_arguments_style=chop_if_long +resharper_js_wrap_before_binary_opsign=false +resharper_js_wrap_for_stmt_header_style=chop_if_long +resharper_js_wrap_lines=true +resharper_js_wrap_parameters_style=chop_if_long +resharper_keep_blank_lines_in_code=2 +resharper_keep_blank_lines_in_declarations=2 +resharper_keep_existing_attribute_arrangement=false +resharper_keep_existing_declaration_block_arrangement=false +resharper_keep_existing_declaration_parens_arrangement=true +resharper_keep_existing_embedded_arrangement=false +resharper_keep_existing_embedded_block_arrangement=false +resharper_keep_existing_enum_arrangement=false +resharper_keep_existing_expr_member_arrangement=false +resharper_keep_existing_initializer_arrangement=false +resharper_keep_existing_invocation_parens_arrangement=true +resharper_keep_existing_property_patterns_arrangement=true +resharper_keep_existing_switch_expression_arrangement=false +resharper_keep_nontrivial_alias=true +resharper_keep_user_linebreaks=true +resharper_keep_user_wrapping=true +resharper_linebreaks_around_razor_statements=true +resharper_linebreaks_inside_tags_for_elements_longer_than=2147483647 +resharper_linebreaks_inside_tags_for_elements_with_child_elements=true +resharper_linebreaks_inside_tags_for_multiline_elements=true +resharper_linebreak_before_all_elements=false +resharper_linebreak_before_multiline_elements=true +resharper_linebreak_before_singleline_elements=false +resharper_line_break_after_colon_in_member_initializer_lists=do_not_change +resharper_line_break_after_comma_in_member_initializer_lists=false +resharper_line_break_before_comma_in_member_initializer_lists=false +resharper_line_break_before_requires_clause=do_not_change +resharper_linkage_specification_braces=end_of_line +resharper_linkage_specification_indentation=none +resharper_local_function_body=expression_body +resharper_macro_block_begin= +resharper_macro_block_end= +resharper_max_array_initializer_elements_on_line=10000 +resharper_max_attribute_length_for_same_line=38 +resharper_max_enum_members_on_line=1 +resharper_max_formal_parameters_on_line=10000 +resharper_max_initializer_elements_on_line=1 +resharper_max_invocation_arguments_on_line=10000 +resharper_media_query_style=same_line +resharper_member_initializer_list_style=do_not_change +resharper_method_or_operator_body=expression_body +resharper_min_blank_lines_after_imports=0 +resharper_min_blank_lines_around_fields=0 +resharper_min_blank_lines_around_functions=1 +resharper_min_blank_lines_around_types=1 +resharper_min_blank_lines_between_declarations=1 +resharper_namespace_declaration_braces=next_line +resharper_namespace_indentation=all +resharper_nested_ternary_style=autodetect +resharper_new_line_before_enumerators=true +resharper_normalize_tag_names=false +resharper_no_indent_inside_elements=html,body,thead,tbody,tfoot +resharper_no_indent_inside_if_element_longer_than=200 +resharper_object_creation_when_type_evident=target_typed +resharper_object_creation_when_type_not_evident=explicitly_typed +resharper_old_engine=false +resharper_options_braces_pointy=false +resharper_outdent_binary_ops=true +resharper_outdent_binary_pattern_ops=false +resharper_outdent_commas=false +resharper_outdent_dots=false +resharper_outdent_namespace_member=false +resharper_outdent_statement_labels=false +resharper_outdent_ternary_ops=false +resharper_parentheses_non_obvious_operations=none, bitwise, bitwise_inclusive_or, bitwise_exclusive_or, shift, bitwise_and +resharper_parentheses_redundancy_style=remove_if_not_clarifies_precedence +resharper_parentheses_same_type_operations=false +resharper_pi_attributes_indent=align_by_first_attribute +resharper_place_attribute_on_same_line=false +resharper_place_class_decorator_on_the_same_line=false +resharper_place_comments_at_first_column=false +resharper_place_constructor_initializer_on_same_line=false +resharper_place_each_decorator_on_new_line=false +resharper_place_event_attribute_on_same_line=false +resharper_place_expr_accessor_on_single_line=true +resharper_place_expr_method_on_single_line=false +resharper_place_expr_property_on_single_line=false +resharper_place_field_decorator_on_the_same_line=false +resharper_place_linq_into_on_new_line=true +resharper_place_method_decorator_on_the_same_line=false +resharper_place_namespace_definitions_on_same_line=false +resharper_place_property_attribute_on_same_line=false +resharper_place_property_decorator_on_the_same_line=false +resharper_place_simple_case_statement_on_same_line=if_owner_is_single_line +resharper_place_simple_embedded_statement_on_same_line=false +resharper_place_simple_enum_on_single_line=true +resharper_place_simple_initializer_on_single_line=true +resharper_place_simple_property_pattern_on_single_line=true +resharper_place_simple_switch_expression_on_single_line=true +resharper_place_template_args_on_new_line=false +resharper_place_type_constraints_on_same_line=true +resharper_prefer_explicit_discard_declaration=false +resharper_prefer_separate_deconstructed_variables_declaration=false +resharper_preserve_spaces_inside_tags=pre,textarea +resharper_properties_style=separate_lines_for_nonsingle +resharper_protobuf_brace_style=end_of_line +resharper_protobuf_empty_block_style=together_same_line +resharper_protobuf_insert_final_newline=false +resharper_protobuf_max_line_length=120 +resharper_protobuf_wrap_lines=true +resharper_qualified_using_at_nested_scope=false +resharper_quote_style=doublequoted +resharper_razor_prefer_qualified_reference=true +resharper_remove_blank_lines_near_braces=false +resharper_remove_blank_lines_near_braces_in_code=true +resharper_remove_blank_lines_near_braces_in_declarations=true +resharper_remove_this_qualifier=true +resharper_requires_expression_braces=next_line +resharper_resx_attribute_indent=single_indent +resharper_resx_insert_final_newline=false +resharper_resx_linebreak_before_elements= +resharper_resx_max_blank_lines_between_tags=0 +resharper_resx_max_line_length=2147483647 +resharper_resx_pi_attribute_style=do_not_touch +resharper_resx_space_before_self_closing=false +resharper_resx_wrap_lines=false +resharper_resx_wrap_tags_and_pi=false +resharper_resx_wrap_text=false +resharper_selector_style=same_line +resharper_show_autodetect_configure_formatting_tip=true +resharper_simple_blocks=do_not_change +resharper_simple_block_style=do_not_change +resharper_simple_case_statement_style=do_not_change +resharper_simple_embedded_statement_style=do_not_change +resharper_single_statement_function_style=do_not_change +resharper_sort_attributes=false +resharper_sort_class_selectors=false +resharper_sort_usings=true +resharper_sort_usings_lowercase_first=false +resharper_spaces_around_eq_in_attribute=false +resharper_spaces_around_eq_in_pi_attribute=false +resharper_spaces_inside_tags=false +resharper_space_after_arrow=true +resharper_space_after_attributes=true +resharper_space_after_attribute_target_colon=true +resharper_space_after_cast=false +resharper_space_after_colon=true +resharper_space_after_colon_in_case=true +resharper_space_after_colon_in_inheritance_clause=true +resharper_space_after_colon_in_type_annotation=true +resharper_space_after_comma=true +resharper_space_after_for_colon=true +resharper_space_after_function_comma=true +resharper_space_after_keywords_in_control_flow_statements=true +resharper_space_after_last_attribute=false +resharper_space_after_last_pi_attribute=false +resharper_space_after_media_colon=true +resharper_space_after_media_comma=true +resharper_space_after_operator_keyword=true +resharper_space_after_property_colon=true +resharper_space_after_property_semicolon=true +resharper_space_after_ptr_in_data_member=true +resharper_space_after_ptr_in_data_members=false +resharper_space_after_ptr_in_method=true +resharper_space_after_ref_in_data_member=true +resharper_space_after_ref_in_data_members=false +resharper_space_after_ref_in_method=true +resharper_space_after_selector_comma=true +resharper_space_after_semicolon_in_for_statement=true +resharper_space_after_separator=false +resharper_space_after_ternary_colon=true +resharper_space_after_ternary_quest=true +resharper_space_after_triple_slash=true +resharper_space_after_type_parameter_constraint_colon=true +resharper_space_around_additive_op=true +resharper_space_around_alias_eq=true +resharper_space_around_assignment_op=true +resharper_space_around_assignment_operator=true +resharper_space_around_attribute_match_operator=false +resharper_space_around_deref_in_trailing_return_type=true +resharper_space_around_lambda_arrow=true +resharper_space_around_member_access_operator=false +resharper_space_around_operator=true +resharper_space_around_pipe_or_amper_in_type_usage=true +resharper_space_around_relational_op=true +resharper_space_around_selector_operator=true +resharper_space_around_shift_op=true +resharper_space_around_stmt_colon=true +resharper_space_around_ternary_operator=true +resharper_space_before_array_rank_parentheses=false +resharper_space_before_arrow=true +resharper_space_before_attribute_target_colon=false +resharper_space_before_checked_parentheses=false +resharper_space_before_colon=false +resharper_space_before_colon_in_case=false +resharper_space_before_colon_in_inheritance_clause=true +resharper_space_before_colon_in_type_annotation=false +resharper_space_before_comma=false +resharper_space_before_default_parentheses=false +resharper_space_before_empty_invocation_parentheses=false +resharper_space_before_empty_method_parentheses=false +resharper_space_before_for_colon=true +resharper_space_before_function_comma=false +resharper_space_before_initializer_braces=false +resharper_space_before_invocation_parentheses=false +resharper_space_before_label_colon=false +resharper_space_before_lambda_parentheses=false +resharper_space_before_media_colon=false +resharper_space_before_media_comma=false +resharper_space_before_method_parentheses=false +resharper_space_before_nameof_parentheses=false +resharper_space_before_new_parentheses=false +resharper_space_before_nullable_mark=false +resharper_space_before_open_square_brackets=false +resharper_space_before_pointer_asterik_declaration=false +resharper_space_before_property_colon=false +resharper_space_before_property_semicolon=false +resharper_space_before_ptr_in_abstract_decl=false +resharper_space_before_ptr_in_data_member=false +resharper_space_before_ptr_in_data_members=true +resharper_space_before_ptr_in_method=false +resharper_space_before_ref_in_abstract_decl=false +resharper_space_before_ref_in_data_member=false +resharper_space_before_ref_in_data_members=true +resharper_space_before_ref_in_method=false +resharper_space_before_selector_comma=false +resharper_space_before_semicolon=false +resharper_space_before_semicolon_in_for_statement=false +resharper_space_before_separator=false +resharper_space_before_singleline_accessorholder=true +resharper_space_before_sizeof_parentheses=false +resharper_space_before_template_args=false +resharper_space_before_template_params=true +resharper_space_before_ternary_colon=true +resharper_space_before_ternary_quest=true +resharper_space_before_trailing_comment=true +resharper_space_before_typeof_parentheses=false +resharper_space_before_type_argument_angle=false +resharper_space_before_type_parameters_brackets=false +resharper_space_before_type_parameter_angle=false +resharper_space_before_type_parameter_constraint_colon=true +resharper_space_before_type_parameter_parentheses=true +resharper_space_between_accessors_in_singleline_property=true +resharper_space_between_attribute_sections=true +resharper_space_between_closing_angle_brackets_in_template_args=false +resharper_space_between_empty_square_brackets=false +resharper_space_between_keyword_and_expression=true +resharper_space_between_keyword_and_type=true +resharper_space_between_method_call_empty_parameter_list_parentheses=false +resharper_space_between_method_call_name_and_opening_parenthesis=false +resharper_space_between_method_call_parameter_list_parentheses=false +resharper_space_between_method_declaration_empty_parameter_list_parentheses=false +resharper_space_between_method_declaration_name_and_open_parenthesis=false +resharper_space_between_method_declaration_parameter_list_parentheses=false +resharper_space_between_parentheses_of_control_flow_statements=false +resharper_space_between_square_brackets=false +resharper_space_between_typecast_parentheses=false +resharper_space_colon_after=true +resharper_space_colon_before=false +resharper_space_comma=true +resharper_space_equals=true +resharper_space_inside_braces=true +resharper_space_in_singleline_accessorholder=true +resharper_space_in_singleline_anonymous_method=true +resharper_space_in_singleline_method=true +resharper_space_near_postfix_and_prefix_op=false +resharper_space_within_array_initialization_braces=false +resharper_space_within_array_rank_empty_parentheses=false +resharper_space_within_array_rank_parentheses=false +resharper_space_within_attribute_angles=false +resharper_space_within_attribute_match_brackets=false +resharper_space_within_checked_parentheses=false +resharper_space_within_default_parentheses=false +resharper_space_within_empty_braces=true +resharper_space_within_empty_initializer_braces=false +resharper_space_within_empty_invocation_parentheses=false +resharper_space_within_empty_method_parentheses=false +resharper_space_within_empty_object_literal_braces=false +resharper_space_within_empty_template_params=false +resharper_space_within_expression_parentheses=false +resharper_space_within_function_parentheses=false +resharper_space_within_import_braces=true +resharper_space_within_initializer_braces=false +resharper_space_within_invocation_parentheses=false +resharper_space_within_media_block=true +resharper_space_within_media_parentheses=false +resharper_space_within_method_parentheses=false +resharper_space_within_nameof_parentheses=false +resharper_space_within_new_parentheses=false +resharper_space_within_object_literal_braces=true +resharper_space_within_parentheses=false +resharper_space_within_property_block=true +resharper_space_within_single_line_array_initializer_braces=true +resharper_space_within_sizeof_parentheses=false +resharper_space_within_template_args=false +resharper_space_within_template_argument=false +resharper_space_within_template_params=false +resharper_space_within_tuple_parentheses=false +resharper_space_within_typeof_parentheses=false +resharper_space_within_type_argument_angles=false +resharper_space_within_type_parameters_brackets=false +resharper_space_within_type_parameter_angles=false +resharper_space_within_type_parameter_parentheses=false +resharper_special_else_if_treatment=true +resharper_static_members_qualify_members=none +resharper_static_members_qualify_with=declared_type +resharper_stick_comment=true +resharper_support_vs_event_naming_pattern=true +resharper_termination_style=ensure_semicolon +resharper_toplevel_function_declaration_return_type_style=do_not_change +resharper_toplevel_function_definition_return_type_style=do_not_change +resharper_trailing_comma_in_multiline_lists=true +resharper_trailing_comma_in_singleline_lists=false +resharper_types_braces=end_of_line +resharper_use_continuous_indent_inside_initializer_braces=true +resharper_use_continuous_indent_inside_parens=true +resharper_use_continuous_line_indent_in_expression_braces=false +resharper_use_continuous_line_indent_in_method_pars=false +resharper_use_heuristics_for_body_style=true +resharper_use_indents_from_main_language_in_file=true +resharper_use_indent_from_previous_element=true +resharper_use_indent_from_vs=false +resharper_use_roslyn_logic_for_evident_types=false +resharper_vb_align_multiline_argument=true +resharper_vb_align_multiline_expression=true +resharper_vb_align_multiline_parameter=true +resharper_vb_align_multiple_declaration=true +resharper_vb_insert_final_newline=false +resharper_vb_max_line_length=120 +resharper_vb_place_field_attribute_on_same_line=true +resharper_vb_place_method_attribute_on_same_line=false +resharper_vb_place_type_attribute_on_same_line=false +resharper_vb_prefer_qualified_reference=false +resharper_vb_space_after_unary_operator=true +resharper_vb_space_around_multiplicative_op=false +resharper_vb_wrap_arguments_style=wrap_if_long +resharper_vb_wrap_before_binary_opsign=false +resharper_vb_wrap_lines=true +resharper_vb_wrap_parameters_style=wrap_if_long +resharper_wrap_after_binary_opsign=true +resharper_wrap_after_declaration_lpar=false +resharper_wrap_after_dot=false +resharper_wrap_after_dot_in_method_calls=false +resharper_wrap_after_expression_lbrace=true +resharper_wrap_after_invocation_lpar=false +resharper_wrap_around_elements=true +resharper_wrap_array_initializer_style=chop_always +resharper_wrap_array_literals=chop_if_long +resharper_wrap_base_clause_style=wrap_if_long +resharper_wrap_before_arrow_with_expressions=true +resharper_wrap_before_binary_pattern_op=true +resharper_wrap_before_colon=false +resharper_wrap_before_comma=false +resharper_wrap_before_comma_in_base_clause=false +resharper_wrap_before_declaration_lpar=false +resharper_wrap_before_declaration_rpar=false +resharper_wrap_before_dot=true +resharper_wrap_before_eq=false +resharper_wrap_before_expression_rbrace=true +resharper_wrap_before_extends_colon=false +resharper_wrap_before_first_type_parameter_constraint=false +resharper_wrap_before_invocation_lpar=false +resharper_wrap_before_invocation_rpar=false +resharper_wrap_before_linq_expression=false +resharper_wrap_before_ternary_opsigns=true +resharper_wrap_before_type_parameter_langle=false +resharper_wrap_braced_init_list_style=wrap_if_long +resharper_wrap_chained_binary_expressions=chop_if_long +resharper_wrap_chained_binary_patterns=wrap_if_long +resharper_wrap_chained_method_calls=wrap_if_long +resharper_wrap_ctor_initializer_style=wrap_if_long +resharper_wrap_enumeration_style=chop_if_long +resharper_wrap_enum_declaration=chop_always +resharper_wrap_enum_style=do_not_change +resharper_wrap_extends_list_style=wrap_if_long +resharper_wrap_imports=chop_if_long +resharper_wrap_multiple_declaration_style=chop_if_long +resharper_wrap_multiple_type_parameter_constraints_style=chop_if_long +resharper_wrap_object_literals=chop_if_long +resharper_wrap_property_pattern=chop_if_long +resharper_wrap_switch_expression=chop_always +resharper_wrap_ternary_expr_style=chop_if_long +resharper_wrap_union_type_usage=chop_if_long +resharper_wrap_verbatim_interpolated_strings=no_wrap +resharper_xmldoc_attribute_indent=single_indent +resharper_xmldoc_insert_final_newline=false +resharper_xmldoc_linebreak_before_elements=summary,remarks,example,returns,param,typeparam,value,para +resharper_xmldoc_max_blank_lines_between_tags=0 +resharper_xmldoc_max_line_length=120 +resharper_xmldoc_pi_attribute_style=do_not_touch +resharper_xmldoc_space_before_self_closing=true +resharper_xmldoc_wrap_lines=true +resharper_xmldoc_wrap_tags_and_pi=true +resharper_xmldoc_wrap_text=true +resharper_xml_attribute_indent=align_by_first_attribute +resharper_xml_insert_final_newline=false +resharper_xml_linebreak_before_elements= +resharper_xml_max_blank_lines_between_tags=2 +resharper_xml_max_line_length=120 +resharper_xml_pi_attribute_style=do_not_touch +resharper_xml_space_before_self_closing=true +resharper_xml_wrap_lines=true +resharper_xml_wrap_tags_and_pi=true +resharper_xml_wrap_text=false + +# ReSharper inspection severities +resharper_abstract_class_constructor_can_be_made_protected_highlighting=hint +resharper_access_rights_in_text_highlighting=warning +resharper_access_to_disposed_closure_highlighting=warning +resharper_access_to_for_each_variable_in_closure_highlighting=warning +resharper_access_to_modified_closure_highlighting=warning +resharper_access_to_static_member_via_derived_type_highlighting=warning +resharper_address_of_marshal_by_ref_object_highlighting=warning +resharper_amd_dependency_path_problem_highlighting=none +resharper_amd_external_module_highlighting=suggestion +resharper_angular_html_banana_highlighting=warning +resharper_annotate_can_be_null_parameter_highlighting=none +resharper_annotate_can_be_null_type_member_highlighting=none +resharper_annotate_not_null_parameter_highlighting=none +resharper_annotate_not_null_type_member_highlighting=none +resharper_annotation_conflict_in_hierarchy_highlighting=warning +resharper_annotation_redundancy_at_value_type_highlighting=warning +resharper_annotation_redundancy_in_hierarchy_highlighting=warning +resharper_arguments_style_anonymous_function_highlighting=hint +resharper_arguments_style_literal_highlighting=hint +resharper_arguments_style_named_expression_highlighting=hint +resharper_arguments_style_other_highlighting=hint +resharper_arguments_style_string_literal_highlighting=hint +resharper_arrange_accessor_owner_body_highlighting=suggestion +resharper_arrange_attributes_highlighting=none +resharper_arrange_constructor_or_destructor_body_highlighting=hint +resharper_arrange_default_value_when_type_evident_highlighting=suggestion +resharper_arrange_default_value_when_type_not_evident_highlighting=hint +resharper_arrange_local_function_body_highlighting=hint +resharper_arrange_method_or_operator_body_highlighting=hint +resharper_arrange_missing_parentheses_highlighting=hint +resharper_arrange_namespace_body_highlighting=hint +resharper_arrange_object_creation_when_type_evident_highlighting=suggestion +resharper_arrange_object_creation_when_type_not_evident_highlighting=hint +resharper_arrange_redundant_parentheses_highlighting=hint +resharper_arrange_static_member_qualifier_highlighting=hint +resharper_arrange_this_qualifier_highlighting=hint +resharper_arrange_trailing_comma_in_multiline_lists_highlighting=hint +resharper_arrange_trailing_comma_in_singleline_lists_highlighting=hint +resharper_arrange_type_member_modifiers_highlighting=hint +resharper_arrange_type_modifiers_highlighting=hint +resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting=suggestion +resharper_asp_content_placeholder_not_resolved_highlighting=error +resharper_asp_custom_page_parser_filter_type_highlighting=warning +resharper_asp_dead_code_highlighting=warning +resharper_asp_entity_highlighting=warning +resharper_asp_image_highlighting=warning +resharper_asp_invalid_control_type_highlighting=error +resharper_asp_not_resolved_highlighting=error +resharper_asp_ods_method_reference_resolve_error_highlighting=error +resharper_asp_resolve_warning_highlighting=warning +resharper_asp_skin_not_resolved_highlighting=error +resharper_asp_tag_attribute_with_optional_value_highlighting=warning +resharper_asp_theme_not_resolved_highlighting=error +resharper_asp_unused_register_directive_highlighting_highlighting=warning +resharper_asp_warning_highlighting=warning +resharper_assigned_value_is_never_used_highlighting=warning +resharper_assigned_value_wont_be_assigned_to_corresponding_field_highlighting=warning +resharper_assignment_in_conditional_expression_highlighting=warning +resharper_assignment_in_condition_expression_highlighting=warning +resharper_assignment_is_fully_discarded_highlighting=warning +resharper_assign_null_to_not_null_attribute_highlighting=warning +resharper_assign_to_constant_highlighting=error +resharper_assign_to_implicit_global_in_function_scope_highlighting=warning +resharper_asxx_path_error_highlighting=warning +resharper_async_iterator_invocation_without_await_foreach_highlighting=warning +resharper_async_void_lambda_highlighting=warning +resharper_async_void_method_highlighting=none +resharper_auto_property_can_be_made_get_only_global_highlighting=suggestion +resharper_auto_property_can_be_made_get_only_local_highlighting=suggestion +resharper_bad_attribute_brackets_spaces_highlighting=none +resharper_bad_braces_spaces_highlighting=none +resharper_bad_child_statement_indent_highlighting=warning +resharper_bad_colon_spaces_highlighting=none +resharper_bad_comma_spaces_highlighting=none +resharper_bad_control_braces_indent_highlighting=suggestion +resharper_bad_control_braces_line_breaks_highlighting=none +resharper_bad_declaration_braces_indent_highlighting=none +resharper_bad_declaration_braces_line_breaks_highlighting=none +resharper_bad_empty_braces_line_breaks_highlighting=none +resharper_bad_expression_braces_indent_highlighting=none +resharper_bad_expression_braces_line_breaks_highlighting=none +resharper_bad_generic_brackets_spaces_highlighting=none +resharper_bad_indent_highlighting=none +resharper_bad_linq_line_breaks_highlighting=none +resharper_bad_list_line_breaks_highlighting=none +resharper_bad_member_access_spaces_highlighting=none +resharper_bad_namespace_braces_indent_highlighting=none +resharper_bad_parens_line_breaks_highlighting=none +resharper_bad_parens_spaces_highlighting=none +resharper_bad_preprocessor_indent_highlighting=none +resharper_bad_semicolon_spaces_highlighting=none +resharper_bad_spaces_after_keyword_highlighting=none +resharper_bad_square_brackets_spaces_highlighting=none +resharper_bad_switch_braces_indent_highlighting=none +resharper_bad_symbol_spaces_highlighting=none +resharper_base_member_has_params_highlighting=warning +resharper_base_method_call_with_default_parameter_highlighting=warning +resharper_base_object_equals_is_object_equals_highlighting=warning +resharper_base_object_get_hash_code_call_in_get_hash_code_highlighting=warning +resharper_bitwise_operator_on_enum_without_flags_highlighting=warning +resharper_block_scope_redeclaration_highlighting=error +resharper_built_in_type_reference_style_for_member_access_highlighting=hint +resharper_built_in_type_reference_style_highlighting=hint +resharper_by_ref_argument_is_volatile_field_highlighting=warning +resharper_caller_callee_using_error_highlighting=error +resharper_caller_callee_using_highlighting=warning +resharper_cannot_apply_equality_operator_to_type_highlighting=warning +resharper_center_tag_is_obsolete_highlighting=warning +resharper_check_for_reference_equality_instead_1_highlighting=suggestion +resharper_check_for_reference_equality_instead_2_highlighting=suggestion +resharper_check_for_reference_equality_instead_3_highlighting=suggestion +resharper_check_for_reference_equality_instead_4_highlighting=suggestion +resharper_check_namespace_highlighting=warning +resharper_class_cannot_be_instantiated_highlighting=warning +resharper_class_can_be_sealed_global_highlighting=none +resharper_class_can_be_sealed_local_highlighting=none +resharper_class_highlighting=suggestion +resharper_class_never_instantiated_global_highlighting=suggestion +resharper_class_never_instantiated_local_highlighting=suggestion +resharper_class_with_virtual_members_never_inherited_global_highlighting=suggestion +resharper_class_with_virtual_members_never_inherited_local_highlighting=suggestion +resharper_clear_attribute_is_obsolete_all_highlighting=warning +resharper_clear_attribute_is_obsolete_highlighting=warning +resharper_closure_on_modified_variable_highlighting=warning +resharper_coerced_equals_using_highlighting=warning +resharper_coerced_equals_using_with_null_undefined_highlighting=none +resharper_collection_never_queried_global_highlighting=warning +resharper_collection_never_queried_local_highlighting=warning +resharper_collection_never_updated_global_highlighting=warning +resharper_collection_never_updated_local_highlighting=warning +resharper_comma_not_valid_here_highlighting=error +resharper_comment_typo_highlighting=suggestion +resharper_common_js_external_module_highlighting=suggestion +resharper_compare_non_constrained_generic_with_null_highlighting=none +resharper_compare_of_floats_by_equality_operator_highlighting=none +resharper_conditional_ternary_equal_branch_highlighting=warning +resharper_condition_is_always_const_highlighting=warning +resharper_condition_is_always_true_or_false_highlighting=warning +resharper_confusing_char_as_integer_in_constructor_highlighting=warning +resharper_constant_conditional_access_qualifier_highlighting=warning +resharper_constant_null_coalescing_condition_highlighting=warning +resharper_constructor_call_not_used_highlighting=warning +resharper_constructor_initializer_loop_highlighting=warning +resharper_container_annotation_redundancy_highlighting=warning +resharper_context_value_is_provided_highlighting=none +resharper_contract_annotation_not_parsed_highlighting=warning +resharper_convert_closure_to_method_group_highlighting=suggestion +resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting=hint +resharper_convert_if_do_to_while_highlighting=suggestion +resharper_convert_if_statement_to_conditional_ternary_expression_highlighting=suggestion +resharper_convert_if_statement_to_null_coalescing_assignment_highlighting=suggestion +resharper_convert_if_statement_to_null_coalescing_expression_highlighting=suggestion +resharper_convert_if_statement_to_return_statement_highlighting=hint +resharper_convert_if_statement_to_switch_expression_highlighting=hint +resharper_convert_if_statement_to_switch_statement_highlighting=hint +resharper_convert_if_to_or_expression_highlighting=suggestion +resharper_convert_nullable_to_short_form_highlighting=suggestion +resharper_convert_switch_statement_to_switch_expression_highlighting=hint +resharper_convert_to_auto_property_highlighting=suggestion +resharper_convert_to_auto_property_when_possible_highlighting=hint +resharper_convert_to_auto_property_with_private_setter_highlighting=hint +resharper_convert_to_compound_assignment_highlighting=hint +resharper_convert_to_constant_global_highlighting=hint +resharper_convert_to_constant_local_highlighting=hint +resharper_convert_to_lambda_expression_highlighting=suggestion +resharper_convert_to_lambda_expression_when_possible_highlighting=none +resharper_convert_to_local_function_highlighting=suggestion +resharper_convert_to_null_coalescing_compound_assignment_highlighting=suggestion +resharper_convert_to_primary_constructor_highlighting=suggestion +resharper_convert_to_static_class_highlighting=suggestion +resharper_convert_to_using_declaration_highlighting=suggestion +resharper_convert_to_vb_auto_property_highlighting=suggestion +resharper_convert_to_vb_auto_property_when_possible_highlighting=hint +resharper_convert_to_vb_auto_property_with_private_setter_highlighting=hint +resharper_convert_type_check_pattern_to_null_check_highlighting=warning +resharper_convert_type_check_to_null_check_highlighting=warning +resharper_co_variant_array_conversion_highlighting=warning +resharper_cpp_abstract_class_without_specifier_highlighting=warning +resharper_cpp_abstract_final_class_highlighting=warning +resharper_cpp_abstract_virtual_function_call_in_ctor_highlighting=error +resharper_cpp_access_specifier_with_no_declarations_highlighting=suggestion +resharper_cpp_assigned_value_is_never_used_highlighting=warning +resharper_cpp_awaiter_type_is_not_class_highlighting=warning +resharper_cpp_bad_angle_brackets_spaces_highlighting=none +resharper_cpp_bad_braces_spaces_highlighting=none +resharper_cpp_bad_child_statement_indent_highlighting=none +resharper_cpp_bad_colon_spaces_highlighting=none +resharper_cpp_bad_comma_spaces_highlighting=none +resharper_cpp_bad_control_braces_indent_highlighting=none +resharper_cpp_bad_control_braces_line_breaks_highlighting=none +resharper_cpp_bad_declaration_braces_indent_highlighting=none +resharper_cpp_bad_declaration_braces_line_breaks_highlighting=none +resharper_cpp_bad_empty_braces_line_breaks_highlighting=none +resharper_cpp_bad_expression_braces_indent_highlighting=none +resharper_cpp_bad_expression_braces_line_breaks_highlighting=none +resharper_cpp_bad_indent_highlighting=none +resharper_cpp_bad_list_line_breaks_highlighting=none +resharper_cpp_bad_member_access_spaces_highlighting=none +resharper_cpp_bad_namespace_braces_indent_highlighting=none +resharper_cpp_bad_parens_line_breaks_highlighting=none +resharper_cpp_bad_parens_spaces_highlighting=none +resharper_cpp_bad_semicolon_spaces_highlighting=none +resharper_cpp_bad_spaces_after_keyword_highlighting=none +resharper_cpp_bad_square_brackets_spaces_highlighting=none +resharper_cpp_bad_switch_braces_indent_highlighting=none +resharper_cpp_bad_symbol_spaces_highlighting=none +resharper_cpp_boolean_increment_expression_highlighting=warning +resharper_cpp_boost_format_bad_code_highlighting=warning +resharper_cpp_boost_format_legacy_code_highlighting=suggestion +resharper_cpp_boost_format_mixed_args_highlighting=error +resharper_cpp_boost_format_too_few_args_highlighting=error +resharper_cpp_boost_format_too_many_args_highlighting=warning +resharper_cpp_clang_tidy_abseil_duration_addition_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_comparison_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_conversion_cast_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_division_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_factory_float_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_factory_scale_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_subtraction_highlighting=none +resharper_cpp_clang_tidy_abseil_duration_unnecessary_conversion_highlighting=none +resharper_cpp_clang_tidy_abseil_faster_strsplit_delimiter_highlighting=none +resharper_cpp_clang_tidy_abseil_no_internal_dependencies_highlighting=none +resharper_cpp_clang_tidy_abseil_no_namespace_highlighting=none +resharper_cpp_clang_tidy_abseil_redundant_strcat_calls_highlighting=none +resharper_cpp_clang_tidy_abseil_string_find_startswith_highlighting=none +resharper_cpp_clang_tidy_abseil_string_find_str_contains_highlighting=none +resharper_cpp_clang_tidy_abseil_str_cat_append_highlighting=none +resharper_cpp_clang_tidy_abseil_time_comparison_highlighting=none +resharper_cpp_clang_tidy_abseil_time_subtraction_highlighting=none +resharper_cpp_clang_tidy_abseil_upgrade_duration_conversions_highlighting=none +resharper_cpp_clang_tidy_altera_id_dependent_backward_branch_highlighting=none +resharper_cpp_clang_tidy_altera_kernel_name_restriction_highlighting=none +resharper_cpp_clang_tidy_altera_single_work_item_barrier_highlighting=none +resharper_cpp_clang_tidy_altera_struct_pack_align_highlighting=none +resharper_cpp_clang_tidy_altera_unroll_loops_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_accept4_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_accept_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_creat_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_dup_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_epoll_create1_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_epoll_create_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_fopen_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_inotify_init1_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_inotify_init_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_memfd_create_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_open_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_pipe2_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_pipe_highlighting=none +resharper_cpp_clang_tidy_android_cloexec_socket_highlighting=none +resharper_cpp_clang_tidy_android_comparison_in_temp_failure_retry_highlighting=none +resharper_cpp_clang_tidy_boost_use_to_string_highlighting=suggestion +resharper_cpp_clang_tidy_bugprone_argument_comment_highlighting=suggestion +resharper_cpp_clang_tidy_bugprone_assert_side_effect_highlighting=warning +resharper_cpp_clang_tidy_bugprone_bad_signal_to_kill_thread_highlighting=warning +resharper_cpp_clang_tidy_bugprone_bool_pointer_implicit_conversion_highlighting=none +resharper_cpp_clang_tidy_bugprone_branch_clone_highlighting=warning +resharper_cpp_clang_tidy_bugprone_copy_constructor_init_highlighting=warning +resharper_cpp_clang_tidy_bugprone_dangling_handle_highlighting=warning +resharper_cpp_clang_tidy_bugprone_dynamic_static_initializers_highlighting=warning +resharper_cpp_clang_tidy_bugprone_easily_swappable_parameters_highlighting=none +resharper_cpp_clang_tidy_bugprone_exception_escape_highlighting=none +resharper_cpp_clang_tidy_bugprone_fold_init_type_highlighting=warning +resharper_cpp_clang_tidy_bugprone_forwarding_reference_overload_highlighting=warning +resharper_cpp_clang_tidy_bugprone_forward_declaration_namespace_highlighting=warning +resharper_cpp_clang_tidy_bugprone_implicit_widening_of_multiplication_result_highlighting=warning +resharper_cpp_clang_tidy_bugprone_inaccurate_erase_highlighting=warning +resharper_cpp_clang_tidy_bugprone_incorrect_roundings_highlighting=warning +resharper_cpp_clang_tidy_bugprone_infinite_loop_highlighting=warning +resharper_cpp_clang_tidy_bugprone_integer_division_highlighting=warning +resharper_cpp_clang_tidy_bugprone_lambda_function_name_highlighting=warning +resharper_cpp_clang_tidy_bugprone_macro_parentheses_highlighting=warning +resharper_cpp_clang_tidy_bugprone_macro_repeated_side_effects_highlighting=warning +resharper_cpp_clang_tidy_bugprone_misplaced_operator_in_strlen_in_alloc_highlighting=warning +resharper_cpp_clang_tidy_bugprone_misplaced_pointer_arithmetic_in_alloc_highlighting=warning +resharper_cpp_clang_tidy_bugprone_misplaced_widening_cast_highlighting=warning +resharper_cpp_clang_tidy_bugprone_move_forwarding_reference_highlighting=warning +resharper_cpp_clang_tidy_bugprone_multiple_statement_macro_highlighting=warning +resharper_cpp_clang_tidy_bugprone_narrowing_conversions_highlighting=warning +resharper_cpp_clang_tidy_bugprone_not_null_terminated_result_highlighting=warning +resharper_cpp_clang_tidy_bugprone_no_escape_highlighting=warning +resharper_cpp_clang_tidy_bugprone_parent_virtual_call_highlighting=warning +resharper_cpp_clang_tidy_bugprone_posix_return_highlighting=warning +resharper_cpp_clang_tidy_bugprone_redundant_branch_condition_highlighting=warning +resharper_cpp_clang_tidy_bugprone_reserved_identifier_highlighting=warning +resharper_cpp_clang_tidy_bugprone_signal_handler_highlighting=warning +resharper_cpp_clang_tidy_bugprone_signed_char_misuse_highlighting=warning +resharper_cpp_clang_tidy_bugprone_sizeof_container_highlighting=warning +resharper_cpp_clang_tidy_bugprone_sizeof_expression_highlighting=warning +resharper_cpp_clang_tidy_bugprone_spuriously_wake_up_functions_highlighting=warning +resharper_cpp_clang_tidy_bugprone_string_constructor_highlighting=warning +resharper_cpp_clang_tidy_bugprone_string_integer_assignment_highlighting=warning +resharper_cpp_clang_tidy_bugprone_string_literal_with_embedded_nul_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_enum_usage_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_include_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_memset_usage_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_missing_comma_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_semicolon_highlighting=warning +resharper_cpp_clang_tidy_bugprone_suspicious_string_compare_highlighting=warning +resharper_cpp_clang_tidy_bugprone_swapped_arguments_highlighting=warning +resharper_cpp_clang_tidy_bugprone_terminating_continue_highlighting=warning +resharper_cpp_clang_tidy_bugprone_throw_keyword_missing_highlighting=warning +resharper_cpp_clang_tidy_bugprone_too_small_loop_variable_highlighting=warning +resharper_cpp_clang_tidy_bugprone_undefined_memory_manipulation_highlighting=warning +resharper_cpp_clang_tidy_bugprone_undelegated_constructor_highlighting=warning +resharper_cpp_clang_tidy_bugprone_unhandled_exception_at_new_highlighting=none +resharper_cpp_clang_tidy_bugprone_unhandled_self_assignment_highlighting=warning +resharper_cpp_clang_tidy_bugprone_unused_raii_highlighting=warning +resharper_cpp_clang_tidy_bugprone_unused_return_value_highlighting=warning +resharper_cpp_clang_tidy_bugprone_use_after_move_highlighting=warning +resharper_cpp_clang_tidy_bugprone_virtual_near_miss_highlighting=suggestion +resharper_cpp_clang_tidy_cert_con36_c_highlighting=none +resharper_cpp_clang_tidy_cert_con54_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_dcl03_c_highlighting=none +resharper_cpp_clang_tidy_cert_dcl16_c_highlighting=none +resharper_cpp_clang_tidy_cert_dcl21_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_dcl37_c_highlighting=none +resharper_cpp_clang_tidy_cert_dcl50_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_dcl51_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_dcl54_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_dcl58_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_dcl59_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_env33_c_highlighting=none +resharper_cpp_clang_tidy_cert_err09_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_err34_c_highlighting=suggestion +resharper_cpp_clang_tidy_cert_err52_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_err58_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_err60_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_err61_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_fio38_c_highlighting=none +resharper_cpp_clang_tidy_cert_flp30_c_highlighting=warning +resharper_cpp_clang_tidy_cert_mem57_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_msc30_c_highlighting=none +resharper_cpp_clang_tidy_cert_msc32_c_highlighting=none +resharper_cpp_clang_tidy_cert_msc50_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_msc51_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_oop11_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_oop54_cpp_highlighting=none +resharper_cpp_clang_tidy_cert_oop57_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_oop58_cpp_highlighting=warning +resharper_cpp_clang_tidy_cert_pos44_c_highlighting=none +resharper_cpp_clang_tidy_cert_pos47_c_highlighting=none +resharper_cpp_clang_tidy_cert_sig30_c_highlighting=none +resharper_cpp_clang_tidy_cert_str34_c_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_google_g_test_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_cast_value_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_return_value_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_std_c_library_functions_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_nonnull_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_builtin_builtin_functions_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_builtin_no_return_functions_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_modeling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_divide_zero_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_dynamic_type_propagation_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_nonnil_string_constants_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_non_null_param_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_null_dereference_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_stack_address_escape_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_stack_addr_escape_base_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_undefined_binary_operator_result_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_array_subscript_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_assign_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_branch_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_captured_block_variable_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_undef_return_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_core_vla_size_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_inner_pointer_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_move_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_leaks_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_placement_new_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_pure_virtual_call_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_self_assignment_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_smart_ptr_modeling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_virtual_call_modeling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_deadcode_dead_stores_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_fuchsia_handle_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullability_base_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_dereferenced_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_passed_to_nonnull_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_returned_from_nonnull_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_null_passed_to_nonnull_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_nullability_null_returned_from_nonnull_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_uninitialized_object_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_virtual_call_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_mpi_mpi_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_empty_localization_context_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_non_localized_string_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_os_object_c_style_cast_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_performance_gcd_antipattern_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_performance_padding_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_optin_portability_unix_api_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_api_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_at_sync_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_autorelease_write_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_class_release_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_dealloc_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_incompatible_method_types_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_loops_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_missing_super_call_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_nil_arg_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_non_nil_return_value_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_autorelease_pool_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_error_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_obj_c_generics_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_base_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_run_loop_autorelease_leak_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_self_init_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_super_dealloc_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_unused_ivars_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_variadic_method_types_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_error_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_number_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_retain_release_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_out_of_bounds_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_pointer_sized_values_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_mig_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_ns_or_cf_error_deref_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_number_object_conversion_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_obj_c_property_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_os_object_retain_count_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_osx_sec_keychain_api_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_float_loop_counter_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcmp_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcopy_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bzero_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_decode_value_of_obj_c_type_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_deprecated_or_unsafe_buffer_handling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_getpw_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_gets_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mkstemp_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mktemp_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_rand_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_security_syntax_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_strcpy_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_unchecked_return_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_vfork_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_api_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_bad_size_arg_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_c_string_modeling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_null_arg_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_dynamic_memory_modeling_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_sizeof_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_mismatched_deallocator_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_unix_vfork_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_valist_copy_to_self_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_valist_uninitialized_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_valist_unterminated_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_valist_valist_base_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_webkit_no_uncounted_member_checker_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_webkit_ref_cntbl_base_virtual_dtor_highlighting=none +resharper_cpp_clang_tidy_clang_analyzer_webkit_uncounted_lambda_captures_checker_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_absolute_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_abstract_final_class_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_abstract_vbase_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_address_of_packed_member_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_address_of_temporary_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_aix_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_align_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_alloca_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_alloca_with_align_alignof_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_delete_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_ellipsis_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_macro_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_member_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_reversed_operator_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_analyzer_incompatible_plugin_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_anonymous_pack_parens_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_anon_enum_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_bridge_casts_disallowed_in_nonarc_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_maybe_repeated_use_of_weak_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_non_pod_memaccess_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_perform_selector_leaks_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_repeated_use_of_weak_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_retain_cycles_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_unsafe_retained_assign_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_argument_outside_range_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_pointer_arithmetic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_asm_operand_widths_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_assign_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_assume_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_atimport_in_framework_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_alignment_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_implicit_seq_cst_highlighting=suggestion +resharper_cpp_clang_tidy_clang_diagnostic_atomic_memory_ordering_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_property_with_user_defined_accessor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_attribute_packed_for_bitfield_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_at_protocol_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_disable_vptr_sanitizer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_import_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_storage_class_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_var_id_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_availability_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_avr_rtlib_linking_quirks_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_backslash_newline_escape_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bad_function_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_binding_in_condition_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bind_to_temporary_copy_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_constant_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_width_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bitwise_conditional_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bitwise_op_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_block_capture_autoreleasing_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bool_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bool_operation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_braced_scalar_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_bridge_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_assume_aligned_alignment_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_builtin_macro_redefined_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_memcpy_chk_size_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_requires_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_c11_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_c2x_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_c99_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_c99_designator_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_c99_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_called_once_parameter_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_call_to_pure_virtual_from_ctor_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_align_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_calling_convention_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_of_sel_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_unrelated_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cf_string_literal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_char_subscripts_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_clang_cl_pch_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_class_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_class_varargs_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cmse_union_leak_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_comma_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_comment_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_compare_distinct_pointer_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_completion_handler_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_complex_component_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_macro_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_space_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_concepts_ts_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_conditional_type_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_conditional_uninitialized_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_config_macros_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_evaluated_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_logical_operand_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_constexpr_not_const_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_consumed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_coroutine_missing_unhandled_exception_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_covered_switch_default_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_deprecated_writable_strings_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_reserved_user_defined_literal_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extra_semi_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_inline_namespace_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_long_long_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_binary_literal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_mangling_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_designator_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp2b_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_bind_to_temporary_copy_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_extra_semi_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_local_type_template_args_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_unnamed_type_template_args_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_binary_literal_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cpp_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cstring_format_directive_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ctad_maybe_unsupported_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_ctu_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_cuda_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_custom_atomic_properties_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_cxx_attribute_extension_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_else_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_field_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_gsl_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_initializer_list_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_darwin_sdk_settings_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_date_time_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dealloc_in_category_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_debug_compression_unavailable_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_declaration_after_statement_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_defaulted_function_deleted_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_delegating_ctor_cycles_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_abstract_non_virtual_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_incomplete_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_non_abstract_non_virtual_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_non_virtual_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_altivec_src_compat_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_anon_enum_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_array_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_attributes_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_comma_subscript_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_copy_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_dynamic_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_conditional_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_implementations_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_increment_bool_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_isa_usage_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_perform_selector_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_register_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_this_capture_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_volatile_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_direct_ivar_access_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_disabled_macro_expansion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_distributed_object_modifiers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_division_by_zero_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dllexport_explicit_instantiation_decl_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dllimport_static_field_def_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dll_attribute_on_redeclaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_deprecated_sync_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_html_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_pedantic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_unknown_command_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_dollar_in_identifier_extension_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_double_promotion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dtor_name_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dtor_typedef_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_decl_specifier_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_arg_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_match_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_protocol_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dynamic_class_memaccess_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_dynamic_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_embedded_directive_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_body_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_decomposition_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_init_stmt_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_translation_unit_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_encode_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_conditional_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_switch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_enum_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_too_large_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_error_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_exceptions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_excess_initializers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_exit_time_destructors_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_expansion_to_defined_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_explicit_initialize_call_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_explicit_ownership_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_export_unnamed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_export_using_directive_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_extern_c_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_extern_initializer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_qualification_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_stmt_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_tokens_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_final_dtor_non_final_class_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_fixed_enum_extension_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_fixed_point_overflow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_flag_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_flexible_array_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_float_equal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_float_overflow_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_float_zero_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_extra_args_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_insufficient_args_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_invalid_specifier_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_nonliteral_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_non_iso_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_pedantic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_security_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_type_confusion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_format_zero_length_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_fortify_source_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_for_loop_analysis_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_four_char_constants_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_framework_include_private_from_public_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_frame_address_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_frame_larger_than_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_free_nonheap_object_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_function_def_in_objc_container_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_function_multiversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gcc_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_global_constructors_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_global_isel_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_alignof_expression_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_anonymous_struct_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_gnu_array_member_paren_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_auto_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_binary_literal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_case_range_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_complex_integer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_compound_literal_initializer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_conditional_omitted_operand_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_designator_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_initializer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_struct_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_initializer_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_union_member_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_folding_constant_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_imaginary_constant_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_include_next_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_inline_cpp_without_extern_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_label_as_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_redeclared_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_static_float_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_string_literal_operator_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_union_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_variable_sized_type_not_at_end_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_zero_variadic_macro_arguments_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_header_guard_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_header_hygiene_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_hip_only_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_idiomatic_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_attributes_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_availability_without_sdk_settings_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_optimization_argument_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragmas_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_intrinsic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_optimize_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_qualifiers_highlighting=suggestion +resharper_cpp_clang_tidy_clang_diagnostic_implicitly_unsigned_literal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_atomic_properties_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_const_int_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_conversion_floating_point_to_bool_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_exception_spec_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_per_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fixed_point_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_function_declaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_float_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_retain_self_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_import_preprocessor_directive_pedantic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inaccessible_base_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_include_next_absolute_path_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_include_next_outside_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_library_redeclaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_struct_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_discards_qualifiers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_property_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_sysroot_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_framework_module_declaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_implementation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_module_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_setjmp_declaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_umbrella_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_dllimport_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_destructor_override_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_override_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_increment_bool_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_independent_class_attribute_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_infinite_recursion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_initializer_overrides_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_injected_class_name_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_asm_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_namespace_reopened_noninline_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_new_delete_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_instantiation_after_specialization_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_integer_overflow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_interrupt_service_routine_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_int_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_int_in_bool_context_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_int_to_pointer_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_int_to_void_pointer_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_constexpr_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_iboutlet_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_initializer_from_system_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_ios_deployment_target_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_noreturn_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_no_builtin_names_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_offsetof_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_or_nonexistent_directory_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_partial_specialization_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_pp_token_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_source_encoding_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_token_paste_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_jump_seh_finally_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_keyword_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_keyword_macro_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_knr_promoted_parameter_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_language_extension_token_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_large_by_value_copy_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_literal_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_literal_range_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_local_type_template_args_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_logical_not_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_logical_op_parentheses_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_long_long_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_macro_redefined_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_main_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_main_return_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_malformed_warning_check_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_many_braces_around_scalar_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_max_tokens_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_max_unsigned_zero_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_memset_transposed_args_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_memsize_comparison_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_method_signatures_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_abstract_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_anon_tag_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_charize_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_comment_paste_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_const_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cpp_macro_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_default_arg_redefinition_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_drectve_section_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_end_of_file_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_forward_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exists_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_explicit_constructor_call_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_extra_qualification_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_fixed_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_flexible_array_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_goto_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inaccessible_base_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_include_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_mutable_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_pure_definition_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_redeclare_static_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_sealed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_static_assert_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_shadow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_union_member_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_unqualified_friend_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_using_decl_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_void_pseudo_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_misleading_indentation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_new_delete_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_parameter_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_return_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_tags_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_braces_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_constinit_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_declarations_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_field_initializers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_method_return_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_noescape_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_noreturn_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_prototypes_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_missing_prototype_for_cc_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_selector_name_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_sysroot_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_variable_declarations_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_misspelled_assumption_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_modules_ambiguous_internal_linkage_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_modules_import_nested_redundant_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_module_conflict_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_module_file_config_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_module_file_extension_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_module_import_in_extern_c_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_multiple_move_vbase_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nested_anon_types_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_newline_eof_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_new_returns_null_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_noderef_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nonnull_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_include_path_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_system_include_path_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_vector_initialization_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memaccess_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_c_typedef_for_linkage_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_literal_null_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_framework_module_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_module_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_pod_varargs_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_power_of_two_alignment_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_non_virtual_dtor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nsconsumed_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nsreturns_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ns_object_attribute_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_on_arrays_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_declspec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_extension_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_inferred_on_nested_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_nullable_to_nonnull_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_arithmetic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_character_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_dereference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_arithmetic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_subtraction_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_odr_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_opencl_unsupported_rgba_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp51_extensions_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_clauses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_loop_form_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_mapping_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_option_ignored_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_ordered_compare_function_pointers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_out_of_line_declaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_out_of_scope_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_overlength_strings_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_overloaded_shift_op_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_overloaded_virtual_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_override_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_override_module_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_overriding_method_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_overriding_t_option_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_over_aligned_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_packed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_padded_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_parentheses_equality_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pass_failed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pch_date_time_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pedantic_core_features_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pedantic_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pessimizing_move_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_arith_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_bool_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_integer_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_sign_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_enum_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_int_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_type_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_poison_system_directories_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_potentially_evaluated_expression_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragmas_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_clang_attribute_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_messages_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_once_outside_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_suspicious_include_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_system_header_outside_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_predefined_identifier_outside_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_pedantic_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_pre_openmp51_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_private_extern_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_private_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_private_module_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_missing_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_out_of_date_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_unprofiled_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_property_access_dot_syntax_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_property_attribute_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_protocol_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_protocol_property_synthesis_ambiguity_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_psabi_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_qualified_void_return_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_quoted_include_in_framework_header_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_analysis_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_bind_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_construct_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_readonly_iboutlet_property_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_receiver_expr_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_receiver_forward_class_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_redeclared_class_member_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_move_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_parens_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_register_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reinterpret_base_class_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reorder_ctor_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reorder_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reorder_init_list_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_requires_expression_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_requires_super_attribute_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_identifier_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_id_macro_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_macro_identifier_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_user_defined_literal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_retained_language_linkage_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_return_stack_address_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_return_std_move_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_return_type_c_linkage_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_return_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_rewrite_not_bool_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_section_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_selector_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_selector_type_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_field_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_overloaded_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_self_move_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_semicolon_before_method_body_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sentinel_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_serialized_diagnostics_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_modified_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_shadow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_ivar_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_uncaptured_local_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_shift_count_negative_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_count_overflow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_negative_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_op_parentheses_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_overflow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_sign_overflow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_shorten64_to32_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_signed_enum_bitfield_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_signed_unsigned_wchar_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sign_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sign_conversion_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_argument_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_decay_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_div_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_div_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_memaccess_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_slash_u_filename_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_slh_asm_goto_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_sometimes_uninitialized_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openmp_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_spir_compat_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_static_float_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_static_inline_explicit_instantiation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_static_in_inline_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_static_local_in_inline_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_static_self_init_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_stdlibcxx_not_found_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_strict_prototypes_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_strict_selector_match_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_string_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_string_concatenation_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_string_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_string_plus_char_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_string_plus_int_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_strlcpy_strlcat_size_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_strncat_size_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_suggest_destructor_override_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_suggest_override_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_super_class_method_mismatch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_suspicious_bzero_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_bool_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_enum_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_sync_fetch_and_nand_semantics_changed_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_bitwise_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_in_range_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_out_of_range_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_objc_bool_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_overlap_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_pointer_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_type_limit_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_undefined_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_char_zero_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_enum_zero_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_zero_compare_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_tautological_value_range_compare_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_incomplete_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_analysis_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_attributes_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_beta_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_negative_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_precise_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_verbose_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_trigraphs_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_typedef_redefinition_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_typename_missing_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_type_safety_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unable_to_open_stats_file_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unavailable_declarations_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undeclared_selector_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_bool_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_func_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_inline_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_type_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_reinterpret_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_var_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undef_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_undef_prefix_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_underaligned_exception_object_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unevaluated_expression_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_new_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_homoglyph_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_whitespace_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_zero_width_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_reference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_argument_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_attributes_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_cuda_version_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_escape_sequence_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_pragmas_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_sanitizers_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_warning_option_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unnamed_type_template_args_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unneeded_internal_declaration_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unneeded_member_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_break_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_loop_increment_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_return_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsequenced_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abs_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_availability_guard_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_cb_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_dll_base_class_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_friend_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_gpopt_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_nan_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_target_opt_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_visibility_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unusable_partial_specialization_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_parameter_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_variable_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unused_comparison_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_const_variable_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_exception_parameter_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_getter_return_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_label_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_lambda_capture_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unused_local_typedef_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_macros_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_member_function_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_parameter_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unused_private_field_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_property_ivar_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_result_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_template_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_value_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_variable_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_unused_volatile_lvalue_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_used_but_marked_unused_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_user_defined_literals_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_user_defined_warnings_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_varargs_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_variadic_macros_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_vector_conversion_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_vec_elem_size_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_vexing_parse_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_visibility_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_enum_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_int_cast_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_void_ptr_dereference_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_warnings_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_wasm_exception_spec_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_weak_template_vtables_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_weak_vtables_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_writable_strings_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_xor_used_as_pow_highlighting=warning +resharper_cpp_clang_tidy_clang_diagnostic_zero_as_null_pointer_constant_highlighting=none +resharper_cpp_clang_tidy_clang_diagnostic_zero_length_array_highlighting=warning +resharper_cpp_clang_tidy_concurrency_mt_unsafe_highlighting=warning +resharper_cpp_clang_tidy_concurrency_thread_canceltype_asynchronous_highlighting=warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_c_arrays_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_goto_highlighting=warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_magic_numbers_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_non_const_global_variables_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_c_copy_assignment_signature_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_explicit_virtual_functions_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_init_variables_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_interfaces_global_init_highlighting=warning +resharper_cpp_clang_tidy_cppcoreguidelines_macro_usage_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_narrowing_conversions_highlighting=warning +resharper_cpp_clang_tidy_cppcoreguidelines_non_private_member_variables_in_classes_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_no_malloc_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_owning_memory_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_prefer_member_initializer_highlighting=suggestion +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_array_to_pointer_decay_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_constant_array_index_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_pointer_arithmetic_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_const_cast_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_cstyle_cast_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_member_init_highlighting=warning +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_reinterpret_cast_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_static_cast_downcast_highlighting=suggestion +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_union_access_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_vararg_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_slicing_highlighting=none +resharper_cpp_clang_tidy_cppcoreguidelines_special_member_functions_highlighting=suggestion +resharper_cpp_clang_tidy_darwin_avoid_spinlock_highlighting=none +resharper_cpp_clang_tidy_darwin_dispatch_once_nonstatic_highlighting=none +resharper_cpp_clang_tidy_fuchsia_default_arguments_calls_highlighting=none +resharper_cpp_clang_tidy_fuchsia_default_arguments_declarations_highlighting=none +resharper_cpp_clang_tidy_fuchsia_header_anon_namespaces_highlighting=none +resharper_cpp_clang_tidy_fuchsia_multiple_inheritance_highlighting=none +resharper_cpp_clang_tidy_fuchsia_overloaded_operator_highlighting=none +resharper_cpp_clang_tidy_fuchsia_statically_constructed_objects_highlighting=none +resharper_cpp_clang_tidy_fuchsia_trailing_return_highlighting=none +resharper_cpp_clang_tidy_fuchsia_virtual_inheritance_highlighting=none +resharper_cpp_clang_tidy_google_build_explicit_make_pair_highlighting=none +resharper_cpp_clang_tidy_google_build_namespaces_highlighting=none +resharper_cpp_clang_tidy_google_build_using_namespace_highlighting=none +resharper_cpp_clang_tidy_google_default_arguments_highlighting=none +resharper_cpp_clang_tidy_google_explicit_constructor_highlighting=none +resharper_cpp_clang_tidy_google_global_names_in_headers_highlighting=none +resharper_cpp_clang_tidy_google_objc_avoid_nsobject_new_highlighting=none +resharper_cpp_clang_tidy_google_objc_avoid_throwing_exception_highlighting=none +resharper_cpp_clang_tidy_google_objc_function_naming_highlighting=none +resharper_cpp_clang_tidy_google_objc_global_variable_declaration_highlighting=none +resharper_cpp_clang_tidy_google_readability_avoid_underscore_in_googletest_name_highlighting=none +resharper_cpp_clang_tidy_google_readability_braces_around_statements_highlighting=none +resharper_cpp_clang_tidy_google_readability_casting_highlighting=none +resharper_cpp_clang_tidy_google_readability_function_size_highlighting=none +resharper_cpp_clang_tidy_google_readability_namespace_comments_highlighting=none +resharper_cpp_clang_tidy_google_readability_todo_highlighting=none +resharper_cpp_clang_tidy_google_runtime_int_highlighting=none +resharper_cpp_clang_tidy_google_runtime_operator_highlighting=warning +resharper_cpp_clang_tidy_google_upgrade_googletest_case_highlighting=suggestion +resharper_cpp_clang_tidy_hicpp_avoid_c_arrays_highlighting=none +resharper_cpp_clang_tidy_hicpp_avoid_goto_highlighting=warning +resharper_cpp_clang_tidy_hicpp_braces_around_statements_highlighting=none +resharper_cpp_clang_tidy_hicpp_deprecated_headers_highlighting=none +resharper_cpp_clang_tidy_hicpp_exception_baseclass_highlighting=suggestion +resharper_cpp_clang_tidy_hicpp_explicit_conversions_highlighting=none +resharper_cpp_clang_tidy_hicpp_function_size_highlighting=none +resharper_cpp_clang_tidy_hicpp_invalid_access_moved_highlighting=none +resharper_cpp_clang_tidy_hicpp_member_init_highlighting=none +resharper_cpp_clang_tidy_hicpp_move_const_arg_highlighting=none +resharper_cpp_clang_tidy_hicpp_multiway_paths_covered_highlighting=warning +resharper_cpp_clang_tidy_hicpp_named_parameter_highlighting=none +resharper_cpp_clang_tidy_hicpp_new_delete_operators_highlighting=none +resharper_cpp_clang_tidy_hicpp_noexcept_move_highlighting=none +resharper_cpp_clang_tidy_hicpp_no_array_decay_highlighting=none +resharper_cpp_clang_tidy_hicpp_no_assembler_highlighting=none +resharper_cpp_clang_tidy_hicpp_no_malloc_highlighting=none +resharper_cpp_clang_tidy_hicpp_signed_bitwise_highlighting=none +resharper_cpp_clang_tidy_hicpp_special_member_functions_highlighting=none +resharper_cpp_clang_tidy_hicpp_static_assert_highlighting=none +resharper_cpp_clang_tidy_hicpp_undelegated_constructor_highlighting=none +resharper_cpp_clang_tidy_hicpp_uppercase_literal_suffix_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_auto_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_emplace_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_equals_default_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_equals_delete_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_noexcept_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_nullptr_highlighting=none +resharper_cpp_clang_tidy_hicpp_use_override_highlighting=none +resharper_cpp_clang_tidy_hicpp_vararg_highlighting=none +resharper_cpp_clang_tidy_highlighting_highlighting=suggestion +resharper_cpp_clang_tidy_linuxkernel_must_check_errs_highlighting=warning +resharper_cpp_clang_tidy_llvmlibc_callee_namespace_highlighting=none +resharper_cpp_clang_tidy_llvmlibc_implementation_in_namespace_highlighting=none +resharper_cpp_clang_tidy_llvmlibc_restrict_system_libc_headers_highlighting=none +resharper_cpp_clang_tidy_llvm_else_after_return_highlighting=none +resharper_cpp_clang_tidy_llvm_header_guard_highlighting=none +resharper_cpp_clang_tidy_llvm_include_order_highlighting=none +resharper_cpp_clang_tidy_llvm_namespace_comment_highlighting=none +resharper_cpp_clang_tidy_llvm_prefer_isa_or_dyn_cast_in_conditionals_highlighting=none +resharper_cpp_clang_tidy_llvm_prefer_register_over_unsigned_highlighting=suggestion +resharper_cpp_clang_tidy_llvm_qualified_auto_highlighting=none +resharper_cpp_clang_tidy_llvm_twine_local_highlighting=none +resharper_cpp_clang_tidy_misc_definitions_in_headers_highlighting=none +resharper_cpp_clang_tidy_misc_misplaced_const_highlighting=warning +resharper_cpp_clang_tidy_misc_new_delete_overloads_highlighting=warning +resharper_cpp_clang_tidy_misc_non_copyable_objects_highlighting=warning +resharper_cpp_clang_tidy_misc_non_private_member_variables_in_classes_highlighting=none +resharper_cpp_clang_tidy_misc_no_recursion_highlighting=none +resharper_cpp_clang_tidy_misc_redundant_expression_highlighting=warning +resharper_cpp_clang_tidy_misc_static_assert_highlighting=suggestion +resharper_cpp_clang_tidy_misc_throw_by_value_catch_by_reference_highlighting=warning +resharper_cpp_clang_tidy_misc_unconventional_assign_operator_highlighting=warning +resharper_cpp_clang_tidy_misc_uniqueptr_reset_release_highlighting=suggestion +resharper_cpp_clang_tidy_misc_unused_alias_decls_highlighting=suggestion +resharper_cpp_clang_tidy_misc_unused_parameters_highlighting=none +resharper_cpp_clang_tidy_misc_unused_using_decls_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_avoid_bind_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_avoid_c_arrays_highlighting=none +resharper_cpp_clang_tidy_modernize_concat_nested_namespaces_highlighting=none +resharper_cpp_clang_tidy_modernize_deprecated_headers_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_deprecated_ios_base_aliases_highlighting=warning +resharper_cpp_clang_tidy_modernize_loop_convert_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_make_shared_highlighting=none +resharper_cpp_clang_tidy_modernize_make_unique_highlighting=none +resharper_cpp_clang_tidy_modernize_pass_by_value_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_raw_string_literal_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_redundant_void_arg_highlighting=none +resharper_cpp_clang_tidy_modernize_replace_auto_ptr_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_replace_disallow_copy_and_assign_macro_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_replace_random_shuffle_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_return_braced_init_list_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_shrink_to_fit_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_unary_static_assert_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_auto_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_bool_literals_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_default_member_init_highlighting=none +resharper_cpp_clang_tidy_modernize_use_emplace_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_equals_default_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_equals_delete_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_nodiscard_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_noexcept_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_nullptr_highlighting=none +resharper_cpp_clang_tidy_modernize_use_override_highlighting=none +resharper_cpp_clang_tidy_modernize_use_trailing_return_type_highlighting=none +resharper_cpp_clang_tidy_modernize_use_transparent_functors_highlighting=suggestion +resharper_cpp_clang_tidy_modernize_use_uncaught_exceptions_highlighting=warning +resharper_cpp_clang_tidy_modernize_use_using_highlighting=none +resharper_cpp_clang_tidy_mpi_buffer_deref_highlighting=warning +resharper_cpp_clang_tidy_mpi_type_mismatch_highlighting=warning +resharper_cpp_clang_tidy_objc_avoid_nserror_init_highlighting=warning +resharper_cpp_clang_tidy_objc_dealloc_in_category_highlighting=warning +resharper_cpp_clang_tidy_objc_forbidden_subclassing_highlighting=warning +resharper_cpp_clang_tidy_objc_missing_hash_highlighting=warning +resharper_cpp_clang_tidy_objc_nsinvocation_argument_lifetime_highlighting=warning +resharper_cpp_clang_tidy_objc_property_declaration_highlighting=warning +resharper_cpp_clang_tidy_objc_super_self_highlighting=warning +resharper_cpp_clang_tidy_openmp_exception_escape_highlighting=warning +resharper_cpp_clang_tidy_openmp_use_default_none_highlighting=warning +resharper_cpp_clang_tidy_performance_faster_string_find_highlighting=suggestion +resharper_cpp_clang_tidy_performance_for_range_copy_highlighting=suggestion +resharper_cpp_clang_tidy_performance_implicit_conversion_in_loop_highlighting=suggestion +resharper_cpp_clang_tidy_performance_inefficient_algorithm_highlighting=suggestion +resharper_cpp_clang_tidy_performance_inefficient_string_concatenation_highlighting=suggestion +resharper_cpp_clang_tidy_performance_inefficient_vector_operation_highlighting=suggestion +resharper_cpp_clang_tidy_performance_move_constructor_init_highlighting=warning +resharper_cpp_clang_tidy_performance_move_const_arg_highlighting=suggestion +resharper_cpp_clang_tidy_performance_noexcept_move_constructor_highlighting=none +resharper_cpp_clang_tidy_performance_no_automatic_move_highlighting=warning +resharper_cpp_clang_tidy_performance_no_int_to_ptr_highlighting=warning +resharper_cpp_clang_tidy_performance_trivially_destructible_highlighting=suggestion +resharper_cpp_clang_tidy_performance_type_promotion_in_math_fn_highlighting=suggestion +resharper_cpp_clang_tidy_performance_unnecessary_copy_initialization_highlighting=suggestion +resharper_cpp_clang_tidy_performance_unnecessary_value_param_highlighting=suggestion +resharper_cpp_clang_tidy_portability_restrict_system_includes_highlighting=none +resharper_cpp_clang_tidy_portability_simd_intrinsics_highlighting=none +resharper_cpp_clang_tidy_readability_avoid_const_params_in_decls_highlighting=none +resharper_cpp_clang_tidy_readability_braces_around_statements_highlighting=none +resharper_cpp_clang_tidy_readability_const_return_type_highlighting=none +resharper_cpp_clang_tidy_readability_container_size_empty_highlighting=suggestion +resharper_cpp_clang_tidy_readability_convert_member_functions_to_static_highlighting=none +resharper_cpp_clang_tidy_readability_delete_null_pointer_highlighting=suggestion +resharper_cpp_clang_tidy_readability_else_after_return_highlighting=none +resharper_cpp_clang_tidy_readability_function_cognitive_complexity_highlighting=none +resharper_cpp_clang_tidy_readability_function_size_highlighting=none +resharper_cpp_clang_tidy_readability_identifier_naming_highlighting=none +resharper_cpp_clang_tidy_readability_implicit_bool_conversion_highlighting=none +resharper_cpp_clang_tidy_readability_inconsistent_declaration_parameter_name_highlighting=suggestion +resharper_cpp_clang_tidy_readability_isolate_declaration_highlighting=none +resharper_cpp_clang_tidy_readability_magic_numbers_highlighting=none +resharper_cpp_clang_tidy_readability_make_member_function_const_highlighting=none +resharper_cpp_clang_tidy_readability_misleading_indentation_highlighting=none +resharper_cpp_clang_tidy_readability_misplaced_array_index_highlighting=suggestion +resharper_cpp_clang_tidy_readability_named_parameter_highlighting=none +resharper_cpp_clang_tidy_readability_non_const_parameter_highlighting=none +resharper_cpp_clang_tidy_readability_qualified_auto_highlighting=none +resharper_cpp_clang_tidy_readability_redundant_access_specifiers_highlighting=none +resharper_cpp_clang_tidy_readability_redundant_control_flow_highlighting=none +resharper_cpp_clang_tidy_readability_redundant_declaration_highlighting=suggestion +resharper_cpp_clang_tidy_readability_redundant_function_ptr_dereference_highlighting=suggestion +resharper_cpp_clang_tidy_readability_redundant_member_init_highlighting=none +resharper_cpp_clang_tidy_readability_redundant_preprocessor_highlighting=warning +resharper_cpp_clang_tidy_readability_redundant_smartptr_get_highlighting=suggestion +resharper_cpp_clang_tidy_readability_redundant_string_cstr_highlighting=suggestion +resharper_cpp_clang_tidy_readability_redundant_string_init_highlighting=suggestion +resharper_cpp_clang_tidy_readability_simplify_boolean_expr_highlighting=none +resharper_cpp_clang_tidy_readability_simplify_subscript_expr_highlighting=warning +resharper_cpp_clang_tidy_readability_static_accessed_through_instance_highlighting=suggestion +resharper_cpp_clang_tidy_readability_static_definition_in_anonymous_namespace_highlighting=none +resharper_cpp_clang_tidy_readability_string_compare_highlighting=warning +resharper_cpp_clang_tidy_readability_suspicious_call_argument_highlighting=warning +resharper_cpp_clang_tidy_readability_uniqueptr_delete_release_highlighting=suggestion +resharper_cpp_clang_tidy_readability_uppercase_literal_suffix_highlighting=none +resharper_cpp_clang_tidy_readability_use_anyofallof_highlighting=suggestion +resharper_cpp_clang_tidy_zircon_temporary_objects_highlighting=none +resharper_cpp_class_can_be_final_highlighting=hint +resharper_cpp_class_disallow_lazy_merging_highlighting=warning +resharper_cpp_class_is_incomplete_highlighting=warning +resharper_cpp_class_needs_constructor_because_of_uninitialized_member_highlighting=warning +resharper_cpp_class_never_used_highlighting=warning +resharper_cpp_compile_time_constant_can_be_replaced_with_boolean_constant_highlighting=suggestion +resharper_cpp_const_parameter_in_declaration_highlighting=suggestion +resharper_cpp_const_value_function_return_type_highlighting=suggestion +resharper_cpp_coroutine_call_resolve_error_highlighting=warning +resharper_cpp_cv_qualifier_can_not_be_applied_to_reference_highlighting=warning +resharper_cpp_c_style_cast_highlighting=suggestion +resharper_cpp_declaration_hides_local_highlighting=warning +resharper_cpp_declaration_hides_uncaptured_local_highlighting=hint +resharper_cpp_declaration_specifier_without_declarators_highlighting=warning +resharper_cpp_declarator_disambiguated_as_function_highlighting=warning +resharper_cpp_declarator_never_used_highlighting=warning +resharper_cpp_declarator_used_before_initialization_highlighting=error +resharper_cpp_defaulted_special_member_function_is_implicitly_deleted_highlighting=warning +resharper_cpp_default_case_not_handled_in_switch_statement_highlighting=warning +resharper_cpp_default_initialization_with_no_user_constructor_highlighting=warning +resharper_cpp_default_is_used_as_identifier_highlighting=warning +resharper_cpp_deleting_void_pointer_highlighting=warning +resharper_cpp_dependent_template_without_template_keyword_highlighting=warning +resharper_cpp_dependent_type_without_typename_keyword_highlighting=warning +resharper_cpp_deprecated_entity_highlighting=warning +resharper_cpp_deprecated_register_storage_class_specifier_highlighting=warning +resharper_cpp_dereference_operator_limit_exceeded_highlighting=warning +resharper_cpp_discarded_postfix_operator_result_highlighting=suggestion +resharper_cpp_doxygen_syntax_error_highlighting=warning +resharper_cpp_doxygen_undocumented_parameter_highlighting=suggestion +resharper_cpp_doxygen_unresolved_reference_highlighting=warning +resharper_cpp_empty_declaration_highlighting=warning +resharper_cpp_enforce_cv_qualifiers_order_highlighting=none +resharper_cpp_enforce_cv_qualifiers_placement_highlighting=none +resharper_cpp_enforce_do_statement_braces_highlighting=none +resharper_cpp_enforce_for_statement_braces_highlighting=none +resharper_cpp_enforce_function_declaration_style_highlighting=none +resharper_cpp_enforce_if_statement_braces_highlighting=none +resharper_cpp_enforce_nested_namespaces_style_highlighting=hint +resharper_cpp_enforce_overriding_destructor_style_highlighting=suggestion +resharper_cpp_enforce_overriding_function_style_highlighting=suggestion +resharper_cpp_enforce_type_alias_code_style_highlighting=none +resharper_cpp_enforce_while_statement_braces_highlighting=none +resharper_cpp_entity_assigned_but_no_read_highlighting=warning +resharper_cpp_entity_used_only_in_unevaluated_context_highlighting=warning +resharper_cpp_enumerator_never_used_highlighting=warning +resharper_cpp_equal_operands_in_binary_expression_highlighting=warning +resharper_cpp_explicit_specialization_in_non_namespace_scope_highlighting=warning +resharper_cpp_expression_without_side_effects_highlighting=warning +resharper_cpp_final_function_in_final_class_highlighting=suggestion +resharper_cpp_final_non_overriding_virtual_function_highlighting=suggestion +resharper_cpp_for_loop_can_be_replaced_with_while_highlighting=suggestion +resharper_cpp_functional_style_cast_highlighting=suggestion +resharper_cpp_function_doesnt_return_value_highlighting=warning +resharper_cpp_function_is_not_implemented_highlighting=warning +resharper_cpp_header_has_been_already_included_highlighting=hint +resharper_cpp_hidden_function_highlighting=warning +resharper_cpp_hiding_function_highlighting=warning +resharper_cpp_identical_operands_in_binary_expression_highlighting=warning +resharper_cpp_if_can_be_replaced_by_constexpr_if_highlighting=suggestion +resharper_cpp_implicit_default_constructor_not_available_highlighting=warning +resharper_cpp_incompatible_pointer_conversion_highlighting=warning +resharper_cpp_incomplete_switch_statement_highlighting=warning +resharper_cpp_inconsistent_naming_highlighting=hint +resharper_cpp_incorrect_blank_lines_near_braces_highlighting=none +resharper_cpp_initialized_value_is_always_rewritten_highlighting=warning +resharper_cpp_integral_to_pointer_conversion_highlighting=warning +resharper_cpp_invalid_line_continuation_highlighting=warning +resharper_cpp_join_declaration_and_assignment_highlighting=suggestion +resharper_cpp_lambda_capture_never_used_highlighting=warning +resharper_cpp_local_variable_may_be_const_highlighting=suggestion +resharper_cpp_local_variable_might_not_be_initialized_highlighting=warning +resharper_cpp_local_variable_with_non_trivial_dtor_is_never_used_highlighting=none +resharper_cpp_long_float_highlighting=warning +resharper_cpp_member_function_may_be_const_highlighting=suggestion +resharper_cpp_member_function_may_be_static_highlighting=suggestion +resharper_cpp_member_initializers_order_highlighting=suggestion +resharper_cpp_mismatched_class_tags_highlighting=warning +resharper_cpp_missing_blank_lines_highlighting=none +resharper_cpp_missing_include_guard_highlighting=warning +resharper_cpp_missing_indent_highlighting=none +resharper_cpp_missing_keyword_throw_highlighting=warning +resharper_cpp_missing_linebreak_highlighting=none +resharper_cpp_missing_space_highlighting=none +resharper_cpp_ms_ext_address_of_class_r_value_highlighting=warning +resharper_cpp_ms_ext_binding_r_value_to_lvalue_reference_highlighting=warning +resharper_cpp_ms_ext_copy_elision_in_copy_init_declarator_highlighting=warning +resharper_cpp_ms_ext_double_user_conversion_in_copy_init_highlighting=warning +resharper_cpp_ms_ext_not_initialized_static_const_local_var_highlighting=warning +resharper_cpp_ms_ext_reinterpret_cast_from_nullptr_highlighting=warning +resharper_cpp_multiple_spaces_highlighting=none +resharper_cpp_must_be_public_virtual_to_implement_interface_highlighting=warning +resharper_cpp_mutable_specifier_on_reference_member_highlighting=warning +resharper_cpp_nodiscard_function_without_return_value_highlighting=warning +resharper_cpp_non_exception_safe_resource_acquisition_highlighting=hint +resharper_cpp_non_explicit_conversion_operator_highlighting=hint +resharper_cpp_non_explicit_converting_constructor_highlighting=hint +resharper_cpp_non_inline_function_definition_in_header_file_highlighting=warning +resharper_cpp_non_inline_variable_definition_in_header_file_highlighting=warning +resharper_cpp_not_all_paths_return_value_highlighting=warning +resharper_cpp_no_discard_expression_highlighting=warning +resharper_cpp_object_member_might_not_be_initialized_highlighting=warning +resharper_cpp_outdent_is_off_prev_level_highlighting=none +resharper_cpp_out_parameter_must_be_written_highlighting=warning +resharper_cpp_parameter_may_be_const_highlighting=hint +resharper_cpp_parameter_may_be_const_ptr_or_ref_highlighting=suggestion +resharper_cpp_parameter_names_mismatch_highlighting=hint +resharper_cpp_parameter_never_used_highlighting=hint +resharper_cpp_parameter_value_is_reassigned_highlighting=warning +resharper_cpp_pointer_conversion_drops_qualifiers_highlighting=warning +resharper_cpp_pointer_to_integral_conversion_highlighting=warning +resharper_cpp_polymorphic_class_with_non_virtual_public_destructor_highlighting=warning +resharper_cpp_possibly_erroneous_empty_statements_highlighting=warning +resharper_cpp_possibly_uninitialized_member_highlighting=warning +resharper_cpp_possibly_unintended_object_slicing_highlighting=warning +resharper_cpp_precompiled_header_is_not_included_highlighting=error +resharper_cpp_precompiled_header_not_found_highlighting=error +resharper_cpp_printf_bad_format_highlighting=warning +resharper_cpp_printf_extra_arg_highlighting=warning +resharper_cpp_printf_missed_arg_highlighting=error +resharper_cpp_printf_risky_format_highlighting=warning +resharper_cpp_private_special_member_function_is_not_implemented_highlighting=warning +resharper_cpp_range_based_for_incompatible_reference_highlighting=warning +resharper_cpp_redefinition_of_default_argument_in_override_function_highlighting=warning +resharper_cpp_redundant_access_specifier_highlighting=hint +resharper_cpp_redundant_base_class_access_specifier_highlighting=hint +resharper_cpp_redundant_blank_lines_highlighting=none +resharper_cpp_redundant_boolean_expression_argument_highlighting=warning +resharper_cpp_redundant_cast_expression_highlighting=hint +resharper_cpp_redundant_const_specifier_highlighting=hint +resharper_cpp_redundant_control_flow_jump_highlighting=hint +resharper_cpp_redundant_elaborated_type_specifier_highlighting=hint +resharper_cpp_redundant_else_keyword_highlighting=hint +resharper_cpp_redundant_else_keyword_inside_compound_statement_highlighting=hint +resharper_cpp_redundant_empty_declaration_highlighting=hint +resharper_cpp_redundant_empty_statement_highlighting=hint +resharper_cpp_redundant_explicit_template_arguments_highlighting=hint +resharper_cpp_redundant_inline_specifier_highlighting=hint +resharper_cpp_redundant_lambda_parameter_list_highlighting=hint +resharper_cpp_redundant_linebreak_highlighting=none +resharper_cpp_redundant_member_initializer_highlighting=suggestion +resharper_cpp_redundant_namespace_definition_highlighting=suggestion +resharper_cpp_redundant_parentheses_highlighting=hint +resharper_cpp_redundant_qualifier_highlighting=hint +resharper_cpp_redundant_space_highlighting=none +resharper_cpp_redundant_static_specifier_on_member_allocation_function_highlighting=hint +resharper_cpp_redundant_template_keyword_highlighting=warning +resharper_cpp_redundant_typename_keyword_highlighting=warning +resharper_cpp_redundant_void_argument_list_highlighting=suggestion +resharper_cpp_reinterpret_cast_from_void_ptr_highlighting=suggestion +resharper_cpp_remove_redundant_braces_highlighting=none +resharper_cpp_replace_memset_with_zero_initialization_highlighting=suggestion +resharper_cpp_replace_tie_with_structured_binding_highlighting=suggestion +resharper_cpp_return_no_value_in_non_void_function_highlighting=warning +resharper_cpp_smart_pointer_vs_make_function_highlighting=suggestion +resharper_cpp_some_object_members_might_not_be_initialized_highlighting=warning +resharper_cpp_special_function_without_noexcept_specification_highlighting=warning +resharper_cpp_static_data_member_in_unnamed_struct_highlighting=warning +resharper_cpp_static_specifier_on_anonymous_namespace_member_highlighting=suggestion +resharper_cpp_string_literal_to_char_pointer_conversion_highlighting=warning +resharper_cpp_syntax_warning_highlighting=warning +resharper_cpp_tabs_and_spaces_mismatch_highlighting=none +resharper_cpp_tabs_are_disallowed_highlighting=none +resharper_cpp_tabs_outside_indent_highlighting=none +resharper_cpp_template_parameter_shadowing_highlighting=warning +resharper_cpp_this_arg_member_func_delegate_ctor_is_unsuported_by_dot_net_core_highlighting=none +resharper_cpp_throw_expression_can_be_replaced_with_rethrow_highlighting=warning +resharper_cpp_too_wide_scope_highlighting=suggestion +resharper_cpp_too_wide_scope_init_statement_highlighting=hint +resharper_cpp_type_alias_never_used_highlighting=warning +resharper_cpp_ue4_blueprint_callable_function_may_be_const_highlighting=hint +resharper_cpp_ue4_blueprint_callable_function_may_be_static_highlighting=hint +resharper_cpp_ue4_coding_standard_naming_violation_warning_highlighting=hint +resharper_cpp_ue4_coding_standard_u_class_naming_violation_error_highlighting=error +resharper_cpp_ue4_probable_memory_issues_with_u_objects_in_container_highlighting=warning +resharper_cpp_ue4_probable_memory_issues_with_u_object_highlighting=warning +resharper_cpp_ue_blueprint_callable_function_unused_highlighting=warning +resharper_cpp_ue_blueprint_implementable_event_not_implemented_highlighting=warning +resharper_cpp_ue_incorrect_engine_directory_highlighting=error +resharper_cpp_ue_non_existent_input_action_highlighting=warning +resharper_cpp_ue_non_existent_input_axis_highlighting=warning +resharper_cpp_ue_source_file_without_predefined_macros_highlighting=warning +resharper_cpp_ue_source_file_without_standard_library_highlighting=error +resharper_cpp_ue_version_file_doesnt_exist_highlighting=error +resharper_cpp_uninitialized_dependent_base_class_highlighting=warning +resharper_cpp_uninitialized_non_static_data_member_highlighting=warning +resharper_cpp_union_member_of_reference_type_highlighting=warning +resharper_cpp_unnamed_namespace_in_header_file_highlighting=warning +resharper_cpp_unnecessary_whitespace_highlighting=none +resharper_cpp_unreachable_code_highlighting=warning +resharper_cpp_unsigned_zero_comparison_highlighting=warning +resharper_cpp_unused_include_directive_highlighting=warning +resharper_cpp_user_defined_literal_suffix_does_not_start_with_underscore_highlighting=warning +resharper_cpp_use_algorithm_with_count_highlighting=suggestion +resharper_cpp_use_associative_contains_highlighting=suggestion +resharper_cpp_use_auto_for_numeric_highlighting=hint +resharper_cpp_use_auto_highlighting=hint +resharper_cpp_use_elements_view_highlighting=suggestion +resharper_cpp_use_erase_algorithm_highlighting=suggestion +resharper_cpp_use_familiar_template_syntax_for_generic_lambdas_highlighting=suggestion +resharper_cpp_use_range_algorithm_highlighting=suggestion +resharper_cpp_use_std_size_highlighting=suggestion +resharper_cpp_use_structured_binding_highlighting=hint +resharper_cpp_use_type_trait_alias_highlighting=suggestion +resharper_cpp_using_result_of_assignment_as_condition_highlighting=warning +resharper_cpp_u_function_macro_call_has_no_effect_highlighting=warning +resharper_cpp_u_property_macro_call_has_no_effect_highlighting=warning +resharper_cpp_variable_can_be_made_constexpr_highlighting=suggestion +resharper_cpp_virtual_function_call_inside_ctor_highlighting=warning +resharper_cpp_virtual_function_in_final_class_highlighting=warning +resharper_cpp_volatile_parameter_in_declaration_highlighting=suggestion +resharper_cpp_wrong_includes_order_highlighting=hint +resharper_cpp_wrong_indent_size_highlighting=none +resharper_cpp_wrong_slashes_in_include_directive_highlighting=hint +resharper_cpp_zero_constant_can_be_replaced_with_nullptr_highlighting=suggestion +resharper_cpp_zero_valued_expression_used_as_null_pointer_highlighting=warning +resharper_create_specialized_overload_highlighting=hint +resharper_css_browser_compatibility_highlighting=warning +resharper_css_caniuse_feature_requires_prefix_highlighting=hint +resharper_css_caniuse_unsupported_feature_highlighting=hint +resharper_css_not_resolved_highlighting=error +resharper_css_obsolete_highlighting=hint +resharper_css_property_does_not_override_vendor_property_highlighting=warning +resharper_cyclic_reference_comment_highlighting=none +resharper_c_declaration_with_implicit_int_type_highlighting=warning +resharper_c_sharp_build_cs_invalid_module_name_highlighting=warning +resharper_c_sharp_missing_plugin_dependency_highlighting=warning +resharper_declaration_hides_highlighting=hint +resharper_declaration_is_empty_highlighting=warning +resharper_declaration_visibility_error_highlighting=error +resharper_default_value_attribute_for_optional_parameter_highlighting=warning +resharper_deleting_non_qualified_reference_highlighting=error +resharper_dl_tag_contains_non_dt_or_dd_elements_highlighting=hint +resharper_double_colons_expected_highlighting=error +resharper_double_colons_preferred_highlighting=suggestion +resharper_double_negation_in_pattern_highlighting=suggestion +resharper_double_negation_of_boolean_highlighting=warning +resharper_double_negation_operator_highlighting=suggestion +resharper_duplicate_identifier_error_highlighting=error +resharper_duplicate_reference_comment_highlighting=warning +resharper_duplicate_resource_highlighting=warning +resharper_duplicating_local_declaration_highlighting=warning +resharper_duplicating_parameter_declaration_error_highlighting=error +resharper_duplicating_property_declaration_error_highlighting=error +resharper_duplicating_property_declaration_highlighting=warning +resharper_duplicating_switch_label_highlighting=warning +resharper_dynamic_shift_right_op_is_not_int_highlighting=warning +resharper_elided_trailing_element_highlighting=warning +resharper_empty_constructor_highlighting=warning +resharper_empty_destructor_highlighting=warning +resharper_empty_embedded_statement_highlighting=warning +resharper_empty_for_statement_highlighting=warning +resharper_empty_general_catch_clause_highlighting=warning +resharper_empty_namespace_highlighting=warning +resharper_empty_object_property_declaration_highlighting=error +resharper_empty_return_value_for_type_annotated_function_highlighting=warning +resharper_empty_statement_highlighting=warning +resharper_empty_title_tag_highlighting=hint +resharper_enforce_do_while_statement_braces_highlighting=none +resharper_enforce_fixed_statement_braces_highlighting=none +resharper_enforce_foreach_statement_braces_highlighting=none +resharper_enforce_for_statement_braces_highlighting=none +resharper_enforce_if_statement_braces_highlighting=none +resharper_enforce_lock_statement_braces_highlighting=none +resharper_enforce_using_statement_braces_highlighting=none +resharper_enforce_while_statement_braces_highlighting=none +resharper_entity_name_captured_only_global_highlighting=warning +resharper_entity_name_captured_only_local_highlighting=warning +resharper_enumerable_sum_in_explicit_unchecked_context_highlighting=warning +resharper_enum_underlying_type_is_int_highlighting=warning +resharper_equal_expression_comparison_highlighting=warning +resharper_error_in_xml_doc_reference_highlighting=error +resharper_es6_feature_highlighting=error +resharper_es7_feature_highlighting=error +resharper_eval_arguments_name_error_highlighting=error +resharper_event_never_invoked_global_highlighting=suggestion +resharper_event_never_subscribed_to_global_highlighting=suggestion +resharper_event_never_subscribed_to_local_highlighting=suggestion +resharper_event_unsubscription_via_anonymous_delegate_highlighting=warning +resharper_experimental_feature_highlighting=error +resharper_explicit_caller_info_argument_highlighting=warning +resharper_expression_is_always_const_highlighting=warning +resharper_expression_is_always_null_highlighting=warning +resharper_field_can_be_made_read_only_global_highlighting=suggestion +resharper_field_can_be_made_read_only_local_highlighting=suggestion +resharper_field_hides_interface_property_with_default_implementation_highlighting=warning +resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting=hint +resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting=hint +resharper_format_string_placeholders_mismatch_highlighting=warning +resharper_format_string_problem_highlighting=warning +resharper_for_can_be_converted_to_foreach_highlighting=suggestion +resharper_for_statement_condition_is_true_highlighting=warning +resharper_functions_used_before_declared_highlighting=none +resharper_function_complexity_overflow_highlighting=none +resharper_function_never_returns_highlighting=warning +resharper_function_parameter_named_arguments_highlighting=warning +resharper_function_recursive_on_all_paths_highlighting=warning +resharper_function_used_out_of_scope_highlighting=warning +resharper_gc_suppress_finalize_for_type_without_destructor_highlighting=warning +resharper_generic_enumerator_not_disposed_highlighting=warning +resharper_heuristically_unreachable_code_highlighting=warning +resharper_heuristic_unreachable_code_highlighting=warning +resharper_hex_color_value_with_alpha_highlighting=error +resharper_html_attributes_quotes_highlighting=hint +resharper_html_attribute_not_resolved_highlighting=warning +resharper_html_attribute_value_not_resolved_highlighting=warning +resharper_html_dead_code_highlighting=warning +resharper_html_event_not_resolved_highlighting=warning +resharper_html_id_duplication_highlighting=warning +resharper_html_id_not_resolved_highlighting=warning +resharper_html_obsolete_highlighting=warning +resharper_html_path_error_highlighting=warning +resharper_html_tag_not_closed_highlighting=error +resharper_html_tag_not_resolved_highlighting=warning +resharper_html_tag_should_be_self_closed_highlighting=warning +resharper_html_tag_should_not_be_self_closed_highlighting=warning +resharper_html_warning_highlighting=warning +resharper_identifier_typo_highlighting=suggestion +resharper_implicit_any_error_highlighting=error +resharper_implicit_any_type_warning_highlighting=warning +resharper_import_keyword_not_with_invocation_highlighting=error +resharper_inactive_preprocessor_branch_highlighting=warning +resharper_inconsistently_synchronized_field_highlighting=warning +resharper_inconsistent_function_returns_highlighting=warning +resharper_inconsistent_naming_highlighting=warning +resharper_inconsistent_order_of_locks_highlighting=warning +resharper_incorrect_blank_lines_near_braces_highlighting=none +resharper_incorrect_operand_in_type_of_comparison_highlighting=warning +resharper_incorrect_triple_slash_location_highlighting=warning +resharper_indexing_by_invalid_range_highlighting=warning +resharper_inheritdoc_consider_usage_highlighting=none +resharper_inheritdoc_invalid_usage_highlighting=warning +resharper_inline_out_variable_declaration_highlighting=suggestion +resharper_inline_temporary_variable_highlighting=hint +resharper_internal_module_highlighting=suggestion +resharper_internal_or_private_member_not_documented_highlighting=none +resharper_interpolated_string_expression_is_not_i_formattable_highlighting=warning +resharper_introduce_optional_parameters_global_highlighting=suggestion +resharper_introduce_optional_parameters_local_highlighting=suggestion +resharper_introduce_variable_to_apply_guard_highlighting=hint +resharper_int_division_by_zero_highlighting=warning +resharper_int_variable_overflow_highlighting=warning +resharper_int_variable_overflow_in_checked_context_highlighting=warning +resharper_int_variable_overflow_in_unchecked_context_highlighting=warning +resharper_invalid_attribute_value_highlighting=warning +resharper_invalid_json_syntax_highlighting=error +resharper_invalid_task_element_highlighting=none +resharper_invalid_value_highlighting=error +resharper_invalid_value_type_highlighting=warning +resharper_invalid_xml_doc_comment_highlighting=warning +resharper_invert_condition_1_highlighting=hint +resharper_invert_if_highlighting=hint +resharper_invocation_is_skipped_highlighting=hint +resharper_invocation_of_non_function_highlighting=warning +resharper_invoked_expression_maybe_non_function_highlighting=warning +resharper_invoke_as_extension_method_highlighting=suggestion +resharper_is_expression_always_false_highlighting=warning +resharper_is_expression_always_true_highlighting=warning +resharper_iterator_method_result_is_ignored_highlighting=warning +resharper_iterator_never_returns_highlighting=warning +resharper_join_declaration_and_initializer_highlighting=suggestion +resharper_join_declaration_and_initializer_js_highlighting=suggestion +resharper_join_null_check_with_usage_highlighting=suggestion +resharper_join_null_check_with_usage_when_possible_highlighting=none +resharper_json_validation_failed_highlighting=error +resharper_js_path_not_found_highlighting=error +resharper_js_unreachable_code_highlighting=warning +resharper_jump_must_be_in_loop_highlighting=warning +resharper_label_or_semicolon_expected_highlighting=error +resharper_lambda_expression_can_be_made_static_highlighting=none +resharper_lambda_expression_must_be_static_highlighting=suggestion +resharper_lambda_highlighting=suggestion +resharper_lambda_should_not_capture_context_highlighting=warning +resharper_less_specific_overload_than_main_signature_highlighting=warning +resharper_lexical_declaration_needs_block_highlighting=error +resharper_localizable_element_highlighting=warning +resharper_local_function_can_be_made_static_highlighting=none +resharper_local_function_hides_method_highlighting=warning +resharper_local_function_redefined_later_highlighting=warning +resharper_local_variable_hides_member_highlighting=warning +resharper_long_literal_ending_lower_l_highlighting=warning +resharper_loop_can_be_converted_to_query_highlighting=hint +resharper_loop_can_be_partly_converted_to_query_highlighting=none +resharper_loop_variable_is_never_changed_inside_loop_highlighting=warning +resharper_l_value_is_expected_highlighting=error +resharper_markup_attribute_typo_highlighting=suggestion +resharper_markup_text_typo_highlighting=suggestion +resharper_math_abs_method_is_redundant_highlighting=warning +resharper_math_clamp_min_greater_than_max_highlighting=warning +resharper_meaningless_default_parameter_value_highlighting=warning +resharper_member_can_be_internal_highlighting=none +resharper_member_can_be_made_static_global_highlighting=hint +resharper_member_can_be_made_static_local_highlighting=hint +resharper_member_can_be_private_global_highlighting=suggestion +resharper_member_can_be_private_local_highlighting=suggestion +resharper_member_can_be_protected_global_highlighting=suggestion +resharper_member_can_be_protected_local_highlighting=suggestion +resharper_member_hides_interface_member_with_default_implementation_highlighting=warning +resharper_member_hides_static_from_outer_class_highlighting=warning +resharper_member_initializer_value_ignored_highlighting=warning +resharper_merge_and_pattern_highlighting=suggestion +resharper_merge_cast_with_type_check_highlighting=suggestion +resharper_merge_conditional_expression_highlighting=suggestion +resharper_merge_conditional_expression_when_possible_highlighting=none +resharper_merge_into_logical_pattern_highlighting=hint +resharper_merge_into_negated_pattern_highlighting=hint +resharper_merge_into_pattern_highlighting=suggestion +resharper_merge_nested_property_patterns_highlighting=suggestion +resharper_merge_sequential_checks_highlighting=hint +resharper_merge_sequential_checks_when_possible_highlighting=none +resharper_method_has_async_overload_highlighting=suggestion +resharper_method_has_async_overload_with_cancellation_highlighting=suggestion +resharper_method_overload_with_optional_parameter_highlighting=warning +resharper_method_safe_this_highlighting=suggestion +resharper_method_supports_cancellation_highlighting=suggestion +resharper_missing_alt_attribute_in_img_tag_highlighting=hint +resharper_missing_attribute_highlighting=warning +resharper_missing_blank_lines_highlighting=none +resharper_missing_body_tag_highlighting=warning +resharper_missing_has_own_property_in_foreach_highlighting=warning +resharper_missing_head_and_body_tags_highlighting=warning +resharper_missing_head_tag_highlighting=warning +resharper_missing_indent_highlighting=none +resharper_missing_linebreak_highlighting=none +resharper_missing_space_highlighting=none +resharper_missing_title_tag_highlighting=hint +resharper_misuse_of_owner_function_this_highlighting=warning +resharper_more_specific_foreach_variable_type_available_highlighting=suggestion +resharper_more_specific_signature_after_less_specific_highlighting=warning +resharper_move_to_existing_positional_deconstruction_pattern_highlighting=hint +resharper_multiple_declarations_in_foreach_highlighting=error +resharper_multiple_nullable_attributes_usage_highlighting=warning +resharper_multiple_order_by_highlighting=warning +resharper_multiple_output_tags_highlighting=warning +resharper_multiple_resolve_candidates_in_text_highlighting=warning +resharper_multiple_spaces_highlighting=none +resharper_multiple_statements_on_one_line_highlighting=none +resharper_multiple_type_members_on_one_line_highlighting=none +resharper_must_use_return_value_highlighting=warning +resharper_mvc_action_not_resolved_highlighting=error +resharper_mvc_area_not_resolved_highlighting=error +resharper_mvc_controller_not_resolved_highlighting=error +resharper_mvc_invalid_model_type_highlighting=error +resharper_mvc_masterpage_not_resolved_highlighting=error +resharper_mvc_partial_view_not_resolved_highlighting=error +resharper_mvc_template_not_resolved_highlighting=error +resharper_mvc_view_component_not_resolved_highlighting=error +resharper_mvc_view_component_view_not_resolved_highlighting=error +resharper_mvc_view_not_resolved_highlighting=error +resharper_native_type_prototype_extending_highlighting=warning +resharper_native_type_prototype_overwriting_highlighting=warning +resharper_negation_of_relational_pattern_highlighting=suggestion +resharper_negative_equality_expression_highlighting=suggestion +resharper_negative_index_highlighting=warning +resharper_nested_string_interpolation_highlighting=suggestion +resharper_non_assigned_constant_highlighting=error +resharper_non_atomic_compound_operator_highlighting=warning +resharper_non_constant_equality_expression_has_constant_result_highlighting=warning +resharper_non_parsable_element_highlighting=warning +resharper_non_readonly_member_in_get_hash_code_highlighting=warning +resharper_non_volatile_field_in_double_check_locking_highlighting=warning +resharper_not_accessed_field_global_highlighting=suggestion +resharper_not_accessed_field_local_highlighting=warning +resharper_not_accessed_positional_property_global_highlighting=warning +resharper_not_accessed_positional_property_local_highlighting=warning +resharper_not_accessed_variable_highlighting=warning +resharper_not_all_paths_return_value_highlighting=warning +resharper_not_assigned_out_parameter_highlighting=warning +resharper_not_declared_in_parent_culture_highlighting=warning +resharper_not_null_member_is_not_initialized_highlighting=warning +resharper_not_observable_annotation_redundancy_highlighting=warning +resharper_not_overridden_in_specific_culture_highlighting=warning +resharper_not_resolved_highlighting=warning +resharper_not_resolved_in_text_highlighting=warning +resharper_nullable_warning_suppression_is_used_highlighting=none +resharper_n_unit_async_method_must_be_task_highlighting=warning +resharper_n_unit_attribute_produces_too_many_tests_highlighting=none +resharper_n_unit_auto_fixture_incorrect_argument_type_highlighting=warning +resharper_n_unit_auto_fixture_missed_test_attribute_highlighting=warning +resharper_n_unit_auto_fixture_missed_test_or_test_fixture_attribute_highlighting=warning +resharper_n_unit_auto_fixture_redundant_argument_in_inline_auto_data_attribute_highlighting=warning +resharper_n_unit_duplicate_values_highlighting=warning +resharper_n_unit_ignored_parameter_attribute_highlighting=warning +resharper_n_unit_implicit_unspecified_null_values_highlighting=warning +resharper_n_unit_incorrect_argument_type_highlighting=warning +resharper_n_unit_incorrect_expected_result_type_highlighting=warning +resharper_n_unit_incorrect_range_bounds_highlighting=warning +resharper_n_unit_method_with_parameters_and_test_attribute_highlighting=warning +resharper_n_unit_missing_arguments_in_test_case_attribute_highlighting=warning +resharper_n_unit_non_public_method_with_test_attribute_highlighting=warning +resharper_n_unit_no_values_provided_highlighting=warning +resharper_n_unit_parameter_type_is_not_compatible_with_attribute_highlighting=warning +resharper_n_unit_range_attribute_bounds_are_out_of_range_highlighting=warning +resharper_n_unit_range_step_sign_mismatch_highlighting=warning +resharper_n_unit_range_step_value_must_not_be_zero_highlighting=warning +resharper_n_unit_range_to_value_is_not_reachable_highlighting=warning +resharper_n_unit_redundant_argument_instead_of_expected_result_highlighting=warning +resharper_n_unit_redundant_argument_in_test_case_attribute_highlighting=warning +resharper_n_unit_redundant_expected_result_in_test_case_attribute_highlighting=warning +resharper_n_unit_test_case_attribute_requires_expected_result_highlighting=warning +resharper_n_unit_test_case_result_property_duplicates_expected_result_highlighting=warning +resharper_n_unit_test_case_result_property_is_obsolete_highlighting=warning +resharper_n_unit_test_case_source_cannot_be_resolved_highlighting=warning +resharper_n_unit_test_case_source_must_be_field_property_method_highlighting=warning +resharper_n_unit_test_case_source_must_be_static_highlighting=warning +resharper_n_unit_test_case_source_should_implement_i_enumerable_highlighting=warning +resharper_object_creation_as_statement_highlighting=warning +resharper_object_destructuring_without_parentheses_highlighting=error +resharper_object_literals_are_not_comma_free_highlighting=error +resharper_obsolete_element_error_highlighting=error +resharper_obsolete_element_highlighting=warning +resharper_octal_literals_not_allowed_error_highlighting=error +resharper_ol_tag_contains_non_li_elements_highlighting=hint +resharper_one_way_operation_contract_with_return_type_highlighting=warning +resharper_operation_contract_without_service_contract_highlighting=warning +resharper_operator_is_can_be_used_highlighting=warning +resharper_optional_parameter_hierarchy_mismatch_highlighting=warning +resharper_optional_parameter_ref_out_highlighting=warning +resharper_other_tags_inside_script1_highlighting=error +resharper_other_tags_inside_script2_highlighting=error +resharper_other_tags_inside_unclosed_script_highlighting=error +resharper_outdent_is_off_prev_level_highlighting=none +resharper_output_tag_required_highlighting=warning +resharper_out_parameter_value_is_always_discarded_global_highlighting=suggestion +resharper_out_parameter_value_is_always_discarded_local_highlighting=warning +resharper_overload_signature_inferring_highlighting=hint +resharper_overridden_with_empty_value_highlighting=warning +resharper_overridden_with_same_value_highlighting=suggestion +resharper_parameter_doesnt_make_any_sense_highlighting=warning +resharper_parameter_hides_member_highlighting=warning +resharper_parameter_only_used_for_precondition_check_global_highlighting=suggestion +resharper_parameter_only_used_for_precondition_check_local_highlighting=warning +resharper_parameter_type_can_be_enumerable_global_highlighting=hint +resharper_parameter_type_can_be_enumerable_local_highlighting=hint +resharper_parameter_value_is_not_used_highlighting=warning +resharper_partial_method_parameter_name_mismatch_highlighting=warning +resharper_partial_method_with_single_part_highlighting=warning +resharper_partial_type_with_single_part_highlighting=warning +resharper_pass_string_interpolation_highlighting=hint +resharper_path_not_resolved_highlighting=error +resharper_pattern_always_matches_highlighting=warning +resharper_pattern_is_always_true_or_false_highlighting=warning +resharper_pattern_never_matches_highlighting=warning +resharper_polymorphic_field_like_event_invocation_highlighting=warning +resharper_possible_infinite_inheritance_highlighting=warning +resharper_possible_intended_rethrow_highlighting=warning +resharper_possible_interface_member_ambiguity_highlighting=warning +resharper_possible_invalid_cast_exception_highlighting=warning +resharper_possible_invalid_cast_exception_in_foreach_loop_highlighting=warning +resharper_possible_invalid_operation_exception_highlighting=warning +resharper_possible_loss_of_fraction_highlighting=warning +resharper_possible_mistaken_argument_highlighting=warning +resharper_possible_mistaken_call_to_get_type_1_highlighting=warning +resharper_possible_mistaken_call_to_get_type_2_highlighting=warning +resharper_possible_multiple_enumeration_highlighting=warning +resharper_possible_multiple_write_access_in_double_check_locking_highlighting=warning +resharper_possible_null_reference_exception_highlighting=warning +resharper_possible_struct_member_modification_of_non_variable_struct_highlighting=warning +resharper_possible_unintended_linear_search_in_set_highlighting=warning +resharper_possible_unintended_queryable_as_enumerable_highlighting=suggestion +resharper_possible_unintended_reference_comparison_highlighting=warning +resharper_possible_write_to_me_highlighting=warning +resharper_possibly_impure_method_call_on_readonly_variable_highlighting=warning +resharper_possibly_incorrectly_broken_statement_highlighting=warning +resharper_possibly_missing_indexer_initializer_comma_highlighting=warning +resharper_possibly_mistaken_use_of_interpolated_string_insert_highlighting=warning +resharper_possibly_mistaken_use_of_params_method_highlighting=warning +resharper_possibly_unassigned_property_highlighting=hint +resharper_private_field_can_be_converted_to_local_variable_highlighting=warning +resharper_private_variable_can_be_made_readonly_highlighting=hint +resharper_property_can_be_made_init_only_global_highlighting=suggestion +resharper_property_can_be_made_init_only_local_highlighting=suggestion +resharper_property_getter_cannot_have_parameters_highlighting=error +resharper_property_not_resolved_highlighting=error +resharper_property_setter_must_have_single_parameter_highlighting=error +resharper_public_constructor_in_abstract_class_highlighting=suggestion +resharper_pure_attribute_on_void_method_highlighting=warning +resharper_qualified_expression_is_null_highlighting=warning +resharper_qualified_expression_maybe_null_highlighting=warning +resharper_razor_layout_not_resolved_highlighting=error +resharper_razor_section_not_resolved_highlighting=error +resharper_read_access_in_double_check_locking_highlighting=warning +resharper_redundant_abstract_modifier_highlighting=warning +resharper_redundant_always_match_subpattern_highlighting=suggestion +resharper_redundant_anonymous_type_property_name_highlighting=warning +resharper_redundant_argument_default_value_highlighting=warning +resharper_redundant_array_creation_expression_highlighting=hint +resharper_redundant_array_lower_bound_specification_highlighting=warning +resharper_redundant_assignment_highlighting=warning +resharper_redundant_attribute_parentheses_highlighting=hint +resharper_redundant_attribute_usage_property_highlighting=suggestion +resharper_redundant_base_constructor_call_highlighting=warning +resharper_redundant_base_qualifier_highlighting=warning +resharper_redundant_blank_lines_highlighting=none +resharper_redundant_block_highlighting=warning +resharper_redundant_bool_compare_highlighting=warning +resharper_redundant_case_label_highlighting=warning +resharper_redundant_cast_highlighting=warning +resharper_redundant_catch_clause_highlighting=warning +resharper_redundant_check_before_assignment_highlighting=warning +resharper_redundant_collection_initializer_element_braces_highlighting=hint +resharper_redundant_comparison_with_boolean_highlighting=warning +resharper_redundant_configure_await_highlighting=suggestion +resharper_redundant_css_hack_highlighting=warning +resharper_redundant_declaration_semicolon_highlighting=hint +resharper_redundant_default_member_initializer_highlighting=warning +resharper_redundant_delegate_creation_highlighting=warning +resharper_redundant_disable_warning_comment_highlighting=warning +resharper_redundant_discard_designation_highlighting=suggestion +resharper_redundant_else_block_highlighting=warning +resharper_redundant_empty_case_else_highlighting=warning +resharper_redundant_empty_constructor_highlighting=warning +resharper_redundant_empty_finally_block_highlighting=warning +resharper_redundant_empty_object_creation_argument_list_highlighting=hint +resharper_redundant_empty_object_or_collection_initializer_highlighting=warning +resharper_redundant_empty_switch_section_highlighting=warning +resharper_redundant_enumerable_cast_call_highlighting=warning +resharper_redundant_enum_case_label_for_default_section_highlighting=none +resharper_redundant_explicit_array_creation_highlighting=warning +resharper_redundant_explicit_array_size_highlighting=warning +resharper_redundant_explicit_nullable_creation_highlighting=warning +resharper_redundant_explicit_params_array_creation_highlighting=suggestion +resharper_redundant_explicit_positional_property_declaration_highlighting=warning +resharper_redundant_explicit_tuple_component_name_highlighting=warning +resharper_redundant_extends_list_entry_highlighting=warning +resharper_redundant_fixed_pointer_declaration_highlighting=suggestion +resharper_redundant_highlighting=warning +resharper_redundant_if_else_block_highlighting=hint +resharper_redundant_if_statement_then_keyword_highlighting=none +resharper_redundant_immediate_delegate_invocation_highlighting=suggestion +resharper_redundant_intermediate_variable_highlighting=hint +resharper_redundant_is_before_relational_pattern_highlighting=suggestion +resharper_redundant_iterator_keyword_highlighting=warning +resharper_redundant_jump_statement_highlighting=warning +resharper_redundant_lambda_parameter_type_highlighting=warning +resharper_redundant_lambda_signature_parentheses_highlighting=hint +resharper_redundant_linebreak_highlighting=none +resharper_redundant_local_class_name_highlighting=hint +resharper_redundant_local_function_name_highlighting=hint +resharper_redundant_logical_conditional_expression_operand_highlighting=warning +resharper_redundant_me_qualifier_highlighting=warning +resharper_redundant_my_base_qualifier_highlighting=warning +resharper_redundant_my_class_qualifier_highlighting=warning +resharper_redundant_name_qualifier_highlighting=warning +resharper_redundant_not_null_constraint_highlighting=warning +resharper_redundant_nullable_annotation_on_reference_type_constraint_highlighting=warning +resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_base_type_highlighting=warning +resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_type_kind_highlighting=warning +resharper_redundant_nullable_flow_attribute_highlighting=warning +resharper_redundant_nullable_type_mark_highlighting=warning +resharper_redundant_nullness_attribute_with_nullable_reference_types_highlighting=warning +resharper_redundant_overflow_checking_context_highlighting=warning +resharper_redundant_overload_global_highlighting=suggestion +resharper_redundant_overload_local_highlighting=suggestion +resharper_redundant_overridden_member_highlighting=warning +resharper_redundant_params_highlighting=warning +resharper_redundant_parentheses_highlighting=none +resharper_redundant_parent_type_declaration_highlighting=warning +resharper_redundant_pattern_parentheses_highlighting=hint +resharper_redundant_property_parentheses_highlighting=hint +resharper_redundant_property_pattern_clause_highlighting=suggestion +resharper_redundant_qualifier_highlighting=warning +resharper_redundant_query_order_by_ascending_keyword_highlighting=hint +resharper_redundant_range_bound_highlighting=suggestion +resharper_redundant_readonly_modifier_highlighting=suggestion +resharper_redundant_record_body_highlighting=warning +resharper_redundant_record_class_keyword_highlighting=warning +resharper_redundant_setter_value_parameter_declaration_highlighting=hint +resharper_redundant_space_highlighting=none +resharper_redundant_string_format_call_highlighting=warning +resharper_redundant_string_interpolation_highlighting=suggestion +resharper_redundant_string_to_char_array_call_highlighting=warning +resharper_redundant_string_type_highlighting=suggestion +resharper_redundant_suppress_nullable_warning_expression_highlighting=warning +resharper_redundant_ternary_expression_highlighting=warning +resharper_redundant_to_string_call_for_value_type_highlighting=hint +resharper_redundant_to_string_call_highlighting=warning +resharper_redundant_type_arguments_of_method_highlighting=warning +resharper_redundant_type_cast_highlighting=warning +resharper_redundant_type_cast_structural_highlighting=warning +resharper_redundant_type_check_in_pattern_highlighting=warning +resharper_redundant_units_highlighting=warning +resharper_redundant_unsafe_context_highlighting=warning +resharper_redundant_using_directive_global_highlighting=warning +resharper_redundant_using_directive_highlighting=warning +resharper_redundant_variable_type_specification_highlighting=hint +resharper_redundant_verbatim_prefix_highlighting=suggestion +resharper_redundant_verbatim_string_prefix_highlighting=suggestion +resharper_redundant_with_expression_highlighting=suggestion +resharper_reference_equals_with_value_type_highlighting=warning +resharper_reg_exp_inspections_highlighting=warning +resharper_remove_constructor_invocation_highlighting=none +resharper_remove_redundant_braces_highlighting=none +resharper_remove_redundant_or_statement_false_highlighting=suggestion +resharper_remove_redundant_or_statement_true_highlighting=suggestion +resharper_remove_to_list_1_highlighting=suggestion +resharper_remove_to_list_2_highlighting=suggestion +resharper_replace_auto_property_with_computed_property_highlighting=hint +resharper_replace_indicing_with_array_destructuring_highlighting=hint +resharper_replace_indicing_with_short_hand_properties_after_destructuring_highlighting=hint +resharper_replace_object_pattern_with_var_pattern_highlighting=suggestion +resharper_replace_slice_with_range_indexer_highlighting=hint +resharper_replace_substring_with_range_indexer_highlighting=hint +resharper_replace_undefined_checking_series_with_object_destructuring_highlighting=hint +resharper_replace_with_destructuring_swap_highlighting=hint +resharper_replace_with_first_or_default_1_highlighting=suggestion +resharper_replace_with_first_or_default_2_highlighting=suggestion +resharper_replace_with_first_or_default_3_highlighting=suggestion +resharper_replace_with_first_or_default_4_highlighting=suggestion +resharper_replace_with_last_or_default_1_highlighting=suggestion +resharper_replace_with_last_or_default_2_highlighting=suggestion +resharper_replace_with_last_or_default_3_highlighting=suggestion +resharper_replace_with_last_or_default_4_highlighting=suggestion +resharper_replace_with_of_type_1_highlighting=suggestion +resharper_replace_with_of_type_2_highlighting=suggestion +resharper_replace_with_of_type_3_highlighting=suggestion +resharper_replace_with_of_type_any_1_highlighting=suggestion +resharper_replace_with_of_type_any_2_highlighting=suggestion +resharper_replace_with_of_type_count_1_highlighting=suggestion +resharper_replace_with_of_type_count_2_highlighting=suggestion +resharper_replace_with_of_type_first_1_highlighting=suggestion +resharper_replace_with_of_type_first_2_highlighting=suggestion +resharper_replace_with_of_type_first_or_default_1_highlighting=suggestion +resharper_replace_with_of_type_first_or_default_2_highlighting=suggestion +resharper_replace_with_of_type_last_1_highlighting=suggestion +resharper_replace_with_of_type_last_2_highlighting=suggestion +resharper_replace_with_of_type_last_or_default_1_highlighting=suggestion +resharper_replace_with_of_type_last_or_default_2_highlighting=suggestion +resharper_replace_with_of_type_long_count_highlighting=suggestion +resharper_replace_with_of_type_single_1_highlighting=suggestion +resharper_replace_with_of_type_single_2_highlighting=suggestion +resharper_replace_with_of_type_single_or_default_1_highlighting=suggestion +resharper_replace_with_of_type_single_or_default_2_highlighting=suggestion +resharper_replace_with_of_type_where_highlighting=suggestion +resharper_replace_with_simple_assignment_false_highlighting=suggestion +resharper_replace_with_simple_assignment_true_highlighting=suggestion +resharper_replace_with_single_assignment_false_highlighting=suggestion +resharper_replace_with_single_assignment_true_highlighting=suggestion +resharper_replace_with_single_call_to_any_highlighting=suggestion +resharper_replace_with_single_call_to_count_highlighting=suggestion +resharper_replace_with_single_call_to_first_highlighting=suggestion +resharper_replace_with_single_call_to_first_or_default_highlighting=suggestion +resharper_replace_with_single_call_to_last_highlighting=suggestion +resharper_replace_with_single_call_to_last_or_default_highlighting=suggestion +resharper_replace_with_single_call_to_single_highlighting=suggestion +resharper_replace_with_single_call_to_single_or_default_highlighting=suggestion +resharper_replace_with_single_or_default_1_highlighting=suggestion +resharper_replace_with_single_or_default_2_highlighting=suggestion +resharper_replace_with_single_or_default_3_highlighting=suggestion +resharper_replace_with_single_or_default_4_highlighting=suggestion +resharper_replace_with_string_is_null_or_empty_highlighting=suggestion +resharper_required_base_types_conflict_highlighting=warning +resharper_required_base_types_direct_conflict_highlighting=warning +resharper_required_base_types_is_not_inherited_highlighting=warning +resharper_requires_fallback_color_highlighting=warning +resharper_resource_item_not_resolved_highlighting=error +resharper_resource_not_resolved_highlighting=error +resharper_resx_not_resolved_highlighting=warning +resharper_return_from_global_scopet_with_value_highlighting=warning +resharper_return_type_can_be_enumerable_global_highlighting=hint +resharper_return_type_can_be_enumerable_local_highlighting=hint +resharper_return_type_can_be_not_nullable_highlighting=warning +resharper_return_value_of_pure_method_is_not_used_highlighting=warning +resharper_route_templates_action_route_prefix_can_be_extracted_to_controller_route_highlighting=hint +resharper_route_templates_ambiguous_matching_constraint_constructor_highlighting=warning +resharper_route_templates_ambiguous_route_match_highlighting=warning +resharper_route_templates_constraint_argument_cannot_be_converted_highlighting=warning +resharper_route_templates_controller_route_parameter_is_not_passed_to_methods_highlighting=hint +resharper_route_templates_duplicated_parameter_highlighting=warning +resharper_route_templates_matching_constraint_constructor_not_resolved_highlighting=warning +resharper_route_templates_method_missing_route_parameters_highlighting=hint +resharper_route_templates_optional_parameter_can_be_preceded_only_by_single_period_highlighting=warning +resharper_route_templates_optional_parameter_must_be_at_the_end_of_segment_highlighting=warning +resharper_route_templates_parameter_constraint_can_be_specified_highlighting=hint +resharper_route_templates_parameter_type_and_constraints_mismatch_highlighting=warning +resharper_route_templates_parameter_type_can_be_made_stricter_highlighting=suggestion +resharper_route_templates_route_parameter_constraint_not_resolved_highlighting=warning +resharper_route_templates_route_parameter_is_not_passed_to_method_highlighting=hint +resharper_route_templates_route_token_not_resolved_highlighting=warning +resharper_route_templates_symbol_not_resolved_highlighting=warning +resharper_route_templates_syntax_error_highlighting=warning +resharper_safe_cast_is_used_as_type_check_highlighting=suggestion +resharper_same_imports_with_different_name_highlighting=warning +resharper_same_variable_assignment_highlighting=warning +resharper_script_tag_has_both_src_and_content_attributes_highlighting=error +resharper_script_tag_with_content_before_includes_highlighting=hint +resharper_sealed_member_in_sealed_class_highlighting=warning +resharper_separate_control_transfer_statement_highlighting=none +resharper_service_contract_without_operations_highlighting=warning +resharper_shift_expression_real_shift_count_is_zero_highlighting=warning +resharper_shift_expression_result_equals_zero_highlighting=warning +resharper_shift_expression_right_operand_not_equal_real_count_highlighting=warning +resharper_shift_expression_zero_left_operand_highlighting=warning +resharper_similar_anonymous_type_nearby_highlighting=hint +resharper_similar_expressions_comparison_highlighting=warning +resharper_simplify_conditional_operator_highlighting=suggestion +resharper_simplify_conditional_ternary_expression_highlighting=suggestion +resharper_simplify_i_if_highlighting=suggestion +resharper_simplify_linq_expression_use_all_highlighting=suggestion +resharper_simplify_linq_expression_use_any_highlighting=suggestion +resharper_simplify_string_interpolation_highlighting=suggestion +resharper_specify_a_culture_in_string_conversion_explicitly_highlighting=warning +resharper_specify_string_comparison_highlighting=hint +resharper_specify_variable_type_explicitly_highlighting=hint +resharper_spin_lock_in_readonly_field_highlighting=warning +resharper_stack_alloc_inside_loop_highlighting=warning +resharper_statement_termination_highlighting=warning +resharper_static_member_initializer_referes_to_member_below_highlighting=warning +resharper_static_member_in_generic_type_highlighting=none +resharper_static_problem_in_text_highlighting=warning +resharper_string_compare_is_culture_specific_1_highlighting=warning +resharper_string_compare_is_culture_specific_2_highlighting=warning +resharper_string_compare_is_culture_specific_3_highlighting=warning +resharper_string_compare_is_culture_specific_4_highlighting=warning +resharper_string_compare_is_culture_specific_5_highlighting=warning +resharper_string_compare_is_culture_specific_6_highlighting=warning +resharper_string_compare_to_is_culture_specific_highlighting=warning +resharper_string_concatenation_to_template_string_highlighting=hint +resharper_string_ends_with_is_culture_specific_highlighting=none +resharper_string_index_of_is_culture_specific_1_highlighting=warning +resharper_string_index_of_is_culture_specific_2_highlighting=warning +resharper_string_index_of_is_culture_specific_3_highlighting=warning +resharper_string_last_index_of_is_culture_specific_1_highlighting=warning +resharper_string_last_index_of_is_culture_specific_2_highlighting=warning +resharper_string_last_index_of_is_culture_specific_3_highlighting=warning +resharper_string_literal_as_interpolation_argument_highlighting=suggestion +resharper_string_literal_typo_highlighting=suggestion +resharper_string_literal_wrong_quotes_highlighting=hint +resharper_string_starts_with_is_culture_specific_highlighting=none +resharper_structured_message_template_problem_highlighting=warning +resharper_struct_can_be_made_read_only_highlighting=suggestion +resharper_struct_member_can_be_made_read_only_highlighting=none +resharper_suggest_base_type_for_parameter_highlighting=hint +resharper_suggest_base_type_for_parameter_in_constructor_highlighting=hint +resharper_suggest_discard_declaration_var_style_highlighting=hint +resharper_suggest_var_or_type_built_in_types_highlighting=hint +resharper_suggest_var_or_type_deconstruction_declarations_highlighting=hint +resharper_suggest_var_or_type_elsewhere_highlighting=hint +resharper_suggest_var_or_type_simple_types_highlighting=hint +resharper_super_call_highlighting=suggestion +resharper_super_call_prohibits_this_highlighting=error +resharper_suppress_nullable_warning_expression_as_inverted_is_expression_highlighting=warning +resharper_suspicious_instanceof_check_highlighting=warning +resharper_suspicious_lambda_block_highlighting=warning +resharper_suspicious_lock_over_synchronization_primitive_highlighting=warning +resharper_suspicious_math_sign_method_highlighting=warning +resharper_suspicious_parameter_name_in_argument_null_exception_highlighting=warning +resharper_suspicious_this_usage_highlighting=warning +resharper_suspicious_typeof_check_highlighting=warning +resharper_suspicious_type_conversion_global_highlighting=warning +resharper_swap_via_deconstruction_highlighting=suggestion +resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting=hint +resharper_switch_statement_for_enum_misses_default_section_highlighting=hint +resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting=hint +resharper_switch_statement_missing_some_enum_cases_no_default_highlighting=none +resharper_symbol_from_not_copied_locally_reference_used_warning_highlighting=warning +resharper_syntax_is_not_allowed_highlighting=warning +resharper_tabs_and_spaces_mismatch_highlighting=none +resharper_tabs_are_disallowed_highlighting=none +resharper_tabs_outside_indent_highlighting=none +resharper_tail_recursive_call_highlighting=hint +resharper_tasks_not_loaded_highlighting=warning +resharper_ternary_can_be_replaced_by_its_condition_highlighting=warning +resharper_this_in_global_context_highlighting=warning +resharper_thread_static_at_instance_field_highlighting=warning +resharper_thread_static_field_has_initializer_highlighting=warning +resharper_throw_must_be_followed_by_expression_highlighting=error +resharper_too_wide_local_variable_scope_highlighting=suggestion +resharper_try_cast_always_succeeds_highlighting=suggestion +resharper_try_statements_can_be_merged_highlighting=hint +resharper_ts_not_resolved_highlighting=error +resharper_ts_resolved_from_inaccessible_module_highlighting=error +resharper_type_guard_doesnt_affect_anything_highlighting=warning +resharper_type_guard_produces_never_type_highlighting=warning +resharper_type_parameter_can_be_variant_highlighting=suggestion +resharper_type_parameter_hides_type_param_from_outer_scope_highlighting=warning +resharper_ul_tag_contains_non_li_elements_highlighting=hint +resharper_unassigned_field_global_highlighting=suggestion +resharper_unassigned_field_local_highlighting=warning +resharper_unassigned_get_only_auto_property_highlighting=warning +resharper_unassigned_readonly_field_highlighting=warning +resharper_unclosed_script_highlighting=error +resharper_undeclared_global_variable_using_highlighting=warning +resharper_unexpected_value_highlighting=error +resharper_unknown_css_class_highlighting=warning +resharper_unknown_css_variable_highlighting=warning +resharper_unknown_css_vendor_extension_highlighting=hint +resharper_unknown_item_group_highlighting=warning +resharper_unknown_metadata_highlighting=warning +resharper_unknown_output_parameter_highlighting=warning +resharper_unknown_property_highlighting=warning +resharper_unknown_target_highlighting=warning +resharper_unknown_task_attribute_highlighting=warning +resharper_unknown_task_highlighting=warning +resharper_unnecessary_whitespace_highlighting=none +resharper_unreachable_switch_arm_due_to_integer_analysis_highlighting=warning +resharper_unreachable_switch_case_due_to_integer_analysis_highlighting=warning +resharper_unreal_header_tool_error_highlighting=error +resharper_unreal_header_tool_parser_error_highlighting=error +resharper_unreal_header_tool_warning_highlighting=warning +resharper_unsafe_comma_in_object_properties_list_highlighting=warning +resharper_unsupported_required_base_type_highlighting=warning +resharper_unused_anonymous_method_signature_highlighting=warning +resharper_unused_auto_property_accessor_global_highlighting=warning +resharper_unused_auto_property_accessor_local_highlighting=warning +resharper_unused_import_clause_highlighting=warning +resharper_unused_inherited_parameter_highlighting=hint +resharper_unused_locals_highlighting=warning +resharper_unused_local_function_highlighting=warning +resharper_unused_local_function_parameter_highlighting=warning +resharper_unused_local_function_return_value_highlighting=warning +resharper_unused_local_import_highlighting=warning +resharper_unused_member_global_highlighting=suggestion +resharper_unused_member_hierarchy_global_highlighting=suggestion +resharper_unused_member_hierarchy_local_highlighting=warning +resharper_unused_member_in_super_global_highlighting=suggestion +resharper_unused_member_in_super_local_highlighting=warning +resharper_unused_member_local_highlighting=warning +resharper_unused_method_return_value_global_highlighting=suggestion +resharper_unused_method_return_value_local_highlighting=warning +resharper_unused_parameter_global_highlighting=suggestion +resharper_unused_parameter_highlighting=warning +resharper_unused_parameter_in_partial_method_highlighting=warning +resharper_unused_parameter_local_highlighting=warning +resharper_unused_property_highlighting=warning +resharper_unused_tuple_component_in_return_value_highlighting=warning +resharper_unused_type_global_highlighting=suggestion +resharper_unused_type_local_highlighting=warning +resharper_unused_type_parameter_highlighting=warning +resharper_unused_variable_highlighting=warning +resharper_usage_of_definitely_unassigned_value_highlighting=warning +resharper_usage_of_possibly_unassigned_value_highlighting=warning +resharper_useless_binary_operation_highlighting=warning +resharper_useless_comparison_to_integral_constant_highlighting=warning +resharper_use_array_creation_expression_1_highlighting=suggestion +resharper_use_array_creation_expression_2_highlighting=suggestion +resharper_use_array_empty_method_highlighting=suggestion +resharper_use_as_instead_of_type_cast_highlighting=hint +resharper_use_await_using_highlighting=suggestion +resharper_use_cancellation_token_for_i_async_enumerable_highlighting=suggestion +resharper_use_collection_count_property_highlighting=suggestion +resharper_use_configure_await_false_for_async_disposable_highlighting=none +resharper_use_configure_await_false_highlighting=suggestion +resharper_use_deconstruction_highlighting=hint +resharper_use_deconstruction_on_parameter_highlighting=hint +resharper_use_empty_types_field_highlighting=suggestion +resharper_use_event_args_empty_field_highlighting=suggestion +resharper_use_format_specifier_in_format_string_highlighting=suggestion +resharper_use_implicitly_typed_variable_evident_highlighting=hint +resharper_use_implicitly_typed_variable_highlighting=none +resharper_use_implicit_by_val_modifier_highlighting=hint +resharper_use_indexed_property_highlighting=suggestion +resharper_use_index_from_end_expression_highlighting=suggestion +resharper_use_is_operator_1_highlighting=suggestion +resharper_use_is_operator_2_highlighting=suggestion +resharper_use_method_any_0_highlighting=suggestion +resharper_use_method_any_1_highlighting=suggestion +resharper_use_method_any_2_highlighting=suggestion +resharper_use_method_any_3_highlighting=suggestion +resharper_use_method_any_4_highlighting=suggestion +resharper_use_method_is_instance_of_type_highlighting=suggestion +resharper_use_nameof_expression_for_part_of_the_string_highlighting=none +resharper_use_nameof_expression_highlighting=suggestion +resharper_use_name_of_instead_of_type_of_highlighting=suggestion +resharper_use_negated_pattern_in_is_expression_highlighting=hint +resharper_use_negated_pattern_matching_highlighting=hint +resharper_use_nullable_annotation_instead_of_attribute_highlighting=suggestion +resharper_use_nullable_attributes_supported_by_compiler_highlighting=suggestion +resharper_use_nullable_reference_types_annotation_syntax_highlighting=warning +resharper_use_null_propagation_highlighting=hint +resharper_use_null_propagation_when_possible_highlighting=none +resharper_use_object_or_collection_initializer_highlighting=suggestion +resharper_use_of_implicit_global_in_function_scope_highlighting=warning +resharper_use_of_possibly_unassigned_property_highlighting=warning +resharper_use_pattern_matching_highlighting=suggestion +resharper_use_positional_deconstruction_pattern_highlighting=none +resharper_use_string_interpolation_highlighting=suggestion +resharper_use_switch_case_pattern_variable_highlighting=suggestion +resharper_use_throw_if_null_method_highlighting=none +resharper_use_verbatim_string_highlighting=hint +resharper_using_of_reserved_word_error_highlighting=error +resharper_using_of_reserved_word_highlighting=warning +resharper_value_parameter_not_used_highlighting=warning +resharper_value_range_attribute_violation_highlighting=warning +resharper_value_should_have_units_highlighting=error +resharper_variable_can_be_made_const_highlighting=hint +resharper_variable_can_be_made_let_highlighting=hint +resharper_variable_can_be_moved_to_inner_block_highlighting=hint +resharper_variable_can_be_not_nullable_highlighting=warning +resharper_variable_hides_outer_variable_highlighting=warning +resharper_variable_used_before_declared_highlighting=warning +resharper_variable_used_in_inner_scope_before_declared_highlighting=warning +resharper_variable_used_out_of_scope_highlighting=warning +resharper_vb_check_for_reference_equality_instead_1_highlighting=suggestion +resharper_vb_check_for_reference_equality_instead_2_highlighting=suggestion +resharper_vb_possible_mistaken_argument_highlighting=warning +resharper_vb_possible_mistaken_call_to_get_type_1_highlighting=warning +resharper_vb_possible_mistaken_call_to_get_type_2_highlighting=warning +resharper_vb_remove_to_list_1_highlighting=suggestion +resharper_vb_remove_to_list_2_highlighting=suggestion +resharper_vb_replace_with_first_or_default_highlighting=suggestion +resharper_vb_replace_with_last_or_default_highlighting=suggestion +resharper_vb_replace_with_of_type_1_highlighting=suggestion +resharper_vb_replace_with_of_type_2_highlighting=suggestion +resharper_vb_replace_with_of_type_any_1_highlighting=suggestion +resharper_vb_replace_with_of_type_any_2_highlighting=suggestion +resharper_vb_replace_with_of_type_count_1_highlighting=suggestion +resharper_vb_replace_with_of_type_count_2_highlighting=suggestion +resharper_vb_replace_with_of_type_first_1_highlighting=suggestion +resharper_vb_replace_with_of_type_first_2_highlighting=suggestion +resharper_vb_replace_with_of_type_first_or_default_1_highlighting=suggestion +resharper_vb_replace_with_of_type_first_or_default_2_highlighting=suggestion +resharper_vb_replace_with_of_type_last_1_highlighting=suggestion +resharper_vb_replace_with_of_type_last_2_highlighting=suggestion +resharper_vb_replace_with_of_type_last_or_default_1_highlighting=suggestion +resharper_vb_replace_with_of_type_last_or_default_2_highlighting=suggestion +resharper_vb_replace_with_of_type_single_1_highlighting=suggestion +resharper_vb_replace_with_of_type_single_2_highlighting=suggestion +resharper_vb_replace_with_of_type_single_or_default_1_highlighting=suggestion +resharper_vb_replace_with_of_type_single_or_default_2_highlighting=suggestion +resharper_vb_replace_with_of_type_where_highlighting=suggestion +resharper_vb_replace_with_single_assignment_1_highlighting=suggestion +resharper_vb_replace_with_single_assignment_2_highlighting=suggestion +resharper_vb_replace_with_single_call_to_any_highlighting=suggestion +resharper_vb_replace_with_single_call_to_count_highlighting=suggestion +resharper_vb_replace_with_single_call_to_first_highlighting=suggestion +resharper_vb_replace_with_single_call_to_first_or_default_highlighting=suggestion +resharper_vb_replace_with_single_call_to_last_highlighting=suggestion +resharper_vb_replace_with_single_call_to_last_or_default_highlighting=suggestion +resharper_vb_replace_with_single_call_to_single_highlighting=suggestion +resharper_vb_replace_with_single_call_to_single_or_default_highlighting=suggestion +resharper_vb_replace_with_single_or_default_highlighting=suggestion +resharper_vb_simplify_linq_expression_10_highlighting=hint +resharper_vb_simplify_linq_expression_1_highlighting=suggestion +resharper_vb_simplify_linq_expression_2_highlighting=suggestion +resharper_vb_simplify_linq_expression_3_highlighting=suggestion +resharper_vb_simplify_linq_expression_4_highlighting=suggestion +resharper_vb_simplify_linq_expression_5_highlighting=suggestion +resharper_vb_simplify_linq_expression_6_highlighting=suggestion +resharper_vb_simplify_linq_expression_7_highlighting=hint +resharper_vb_simplify_linq_expression_8_highlighting=hint +resharper_vb_simplify_linq_expression_9_highlighting=hint +resharper_vb_string_compare_is_culture_specific_1_highlighting=warning +resharper_vb_string_compare_is_culture_specific_2_highlighting=warning +resharper_vb_string_compare_is_culture_specific_3_highlighting=warning +resharper_vb_string_compare_is_culture_specific_4_highlighting=warning +resharper_vb_string_compare_is_culture_specific_5_highlighting=warning +resharper_vb_string_compare_is_culture_specific_6_highlighting=warning +resharper_vb_string_compare_to_is_culture_specific_highlighting=warning +resharper_vb_string_ends_with_is_culture_specific_highlighting=none +resharper_vb_string_index_of_is_culture_specific_1_highlighting=warning +resharper_vb_string_index_of_is_culture_specific_2_highlighting=warning +resharper_vb_string_index_of_is_culture_specific_3_highlighting=warning +resharper_vb_string_last_index_of_is_culture_specific_1_highlighting=warning +resharper_vb_string_last_index_of_is_culture_specific_2_highlighting=warning +resharper_vb_string_last_index_of_is_culture_specific_3_highlighting=warning +resharper_vb_string_starts_with_is_culture_specific_highlighting=none +resharper_vb_unreachable_code_highlighting=warning +resharper_vb_use_array_creation_expression_1_highlighting=suggestion +resharper_vb_use_array_creation_expression_2_highlighting=suggestion +resharper_vb_use_first_instead_highlighting=warning +resharper_vb_use_method_any_1_highlighting=suggestion +resharper_vb_use_method_any_2_highlighting=suggestion +resharper_vb_use_method_any_3_highlighting=suggestion +resharper_vb_use_method_any_4_highlighting=suggestion +resharper_vb_use_method_any_5_highlighting=suggestion +resharper_vb_use_method_is_instance_of_type_highlighting=suggestion +resharper_vb_use_type_of_is_operator_1_highlighting=suggestion +resharper_vb_use_type_of_is_operator_2_highlighting=suggestion +resharper_virtual_member_call_in_constructor_highlighting=warning +resharper_virtual_member_never_overridden_global_highlighting=suggestion +resharper_virtual_member_never_overridden_local_highlighting=suggestion +resharper_void_method_with_must_use_return_value_attribute_highlighting=warning +resharper_web_config_module_not_resolved_highlighting=error +resharper_web_config_module_qualification_resolve_highlighting=warning +resharper_web_config_redundant_add_namespace_tag_highlighting=warning +resharper_web_config_redundant_location_tag_highlighting=warning +resharper_web_config_tag_prefix_redundand_highlighting=warning +resharper_web_config_type_not_resolved_highlighting=error +resharper_web_config_unused_add_tag_highlighting=warning +resharper_web_config_unused_element_due_to_config_source_attribute_highlighting=warning +resharper_web_config_unused_remove_or_clear_tag_highlighting=warning +resharper_web_config_web_config_path_warning_highlighting=warning +resharper_web_config_wrong_module_highlighting=error +resharper_web_ignored_path_highlighting=none +resharper_web_mapped_path_highlighting=hint +resharper_with_expression_instead_of_initializer_highlighting=suggestion +resharper_with_statement_using_error_highlighting=error +resharper_wrong_expression_statement_highlighting=warning +resharper_wrong_indent_size_highlighting=none +resharper_wrong_metadata_use_highlighting=none +resharper_wrong_public_modifier_specification_highlighting=hint +resharper_wrong_require_relative_path_highlighting=hint +resharper_xaml_assign_null_to_not_null_attribute_highlighting=warning +resharper_xaml_avalonia_wrong_binding_mode_for_stream_binding_operator_highlighting=warning +resharper_xaml_binding_without_context_not_resolved_highlighting=hint +resharper_xaml_binding_with_context_not_resolved_highlighting=warning +resharper_xaml_compiled_binding_missing_data_type_error_highlighting_highlighting=error +resharper_xaml_constructor_warning_highlighting=warning +resharper_xaml_decimal_parsing_is_culture_dependent_highlighting=warning +resharper_xaml_dependency_property_resolve_error_highlighting=warning +resharper_xaml_duplicate_style_setter_highlighting=warning +resharper_xaml_dynamic_resource_error_highlighting=error +resharper_xaml_element_name_reference_not_resolved_highlighting=error +resharper_xaml_empty_grid_length_definition_highlighting=error +resharper_xaml_grid_definitions_can_be_converted_to_attribute_highlighting=hint +resharper_xaml_ignored_path_highlighting_highlighting=none +resharper_xaml_index_out_of_grid_definition_highlighting=warning +resharper_xaml_invalid_member_type_highlighting=error +resharper_xaml_invalid_resource_target_type_highlighting=error +resharper_xaml_invalid_resource_type_highlighting=error +resharper_xaml_invalid_type_highlighting=error +resharper_xaml_language_level_highlighting=error +resharper_xaml_mapped_path_highlighting_highlighting=hint +resharper_xaml_method_arguments_will_be_ignored_highlighting=warning +resharper_xaml_missing_grid_index_highlighting=warning +resharper_xaml_overloads_collision_highlighting=warning +resharper_xaml_parent_is_out_of_current_component_tree_highlighting=warning +resharper_xaml_path_error_highlighting=warning +resharper_xaml_possible_null_reference_exception_highlighting=suggestion +resharper_xaml_redundant_attached_property_highlighting=warning +resharper_xaml_redundant_binding_mode_attribute_highlighting=warning +resharper_xaml_redundant_collection_property_highlighting=warning +resharper_xaml_redundant_freeze_attribute_highlighting=warning +resharper_xaml_redundant_grid_definitions_highlighting=warning +resharper_xaml_redundant_grid_span_highlighting=warning +resharper_xaml_redundant_modifiers_attribute_highlighting=warning +resharper_xaml_redundant_namespace_alias_highlighting=warning +resharper_xaml_redundant_name_attribute_highlighting=warning +resharper_xaml_redundant_property_type_qualifier_highlighting=warning +resharper_xaml_redundant_resource_highlighting=warning +resharper_xaml_redundant_styled_value_highlighting=warning +resharper_xaml_redundant_update_source_trigger_attribute_highlighting=warning +resharper_xaml_redundant_xamarin_forms_class_declaration_highlighting=warning +resharper_xaml_resource_file_path_case_mismatch_highlighting=warning +resharper_xaml_routed_event_resolve_error_highlighting=warning +resharper_xaml_static_resource_not_resolved_highlighting=warning +resharper_xaml_style_class_not_found_highlighting=warning +resharper_xaml_style_invalid_target_type_highlighting=error +resharper_xaml_unexpected_text_token_highlighting=error +resharper_xaml_xaml_duplicate_device_family_type_view_highlighting_highlighting=error +resharper_xaml_xaml_mismatched_device_family_view_clr_name_highlighting_highlighting=warning +resharper_xaml_xaml_relative_source_default_mode_warning_highlighting_highlighting=warning +resharper_xaml_xaml_unknown_device_family_type_highlighting_highlighting=warning +resharper_xaml_xaml_xamarin_forms_data_type_and_binding_context_type_mismatched_highlighting_highlighting=warning +resharper_xaml_x_key_attribute_disallowed_highlighting=error +resharper_xml_doc_comment_syntax_problem_highlighting=warning +resharper_xunit_xunit_test_with_console_output_highlighting=warning +csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion +csharp_style_expression_bodied_methods = true:silent +csharp_style_prefer_tuple_swap = true:suggestion +csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_expression_bodied_constructors = true:silent +csharp_style_expression_bodied_operators = true:silent +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_style_expression_bodied_properties = true:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_prefer_system_threading_lock = true:suggestion +csharp_style_prefer_simple_property_accessors = true:suggestion +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_throw_expression = true:suggestion +csharp_style_prefer_null_check_over_type_check = true:suggestion +csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +csharp_prefer_static_local_function = true:suggestion +csharp_style_prefer_readonly_struct = true:suggestion +csharp_prefer_static_anonymous_function = true:suggestion +csharp_style_prefer_readonly_struct_member = true:suggestion +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent +csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_prefer_switch_expression = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_prefer_extended_property_pattern = true:suggestion + +[*.{cshtml,htm,html,proto,razor}] +indent_style=tab +indent_size=tab +tab_width=4 + +[*.{asax,ascx,aspx,axaml,c,c++,cc,cginc,compute,cp,cpp,cs,css,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,js,jsx,master,mpp,mq4,mq5,mqh,paml,skin,tpp,ts,tsx,usf,ush,vb,xaml,xamlx,xoml}] +indent_style=space +indent_size=4 +tab_width=4 + +[ "*.proto" ] +indent_style=tab +indent_size=tab +tab_width=4 + +[*.{asax,ascx,aspx,axaml,cs,cshtml,css,htm,html,js,jsx,master,paml,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}] +indent_style=space +indent_size=4 +tab_width=4 + +[*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}] +indent_style=space +indent_size=2 +tab_width=2 + +[*.{appxmanifest,asax,ascx,aspx,axaml,axml,build,c,c++,cc,cginc,compute,config,cp,cpp,cs,cshtml,csproj,css,cu,cuh,cxx,dbml,discomap,dtd,h,hh,hlsl,hlsli,hlslinc,hpp,htm,html,hxx,inc,inl,ino,ipp,js,json,jsproj,jsx,lsproj,master,mpp,mq4,mq5,mqh,njsproj,nuspec,paml,proj,props,proto,razor,resjson,resw,resx,skin,StyleCop,targets,tasks,tpp,ts,tsx,usf,ush,vb,vbproj,xaml,xamlx,xml,xoml,xsd}] +indent_style=space +indent_size= 4 +tab_width= 4 +dotnet_style_operator_placement_when_wrapping = beginning_of_line +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_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_namespace_match_folder = true:suggestion +insert_final_newline = true +end_of_line = lf +dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion +dotnet_style_readonly_field = true:suggestion +dotnet_style_allow_statement_immediately_after_block_experimental = true:silent +dotnet_style_allow_multiple_blank_lines_experimental = true:silent +dotnet_code_quality_unused_parameters = all:suggestion +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent diff --git a/Luna b/Luna index 91417405d..b0cd45bed 160000 --- a/Luna +++ b/Luna @@ -1 +1 @@ -Subproject commit 91417405d327f89d4bb3a802fea2ab185f1e9962 +Subproject commit b0cd45bed8cb955ddb6ec2e464b36726e72d38e8 diff --git a/Penumbra.Api b/Penumbra.Api index 439b83946..696007d8a 160000 --- a/Penumbra.Api +++ b/Penumbra.Api @@ -1 +1 @@ -Subproject commit 439b83946bcea82080813d9b310b76b253bcf763 +Subproject commit 696007d8a630218333c2b472b42b31e16a840d75 diff --git a/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj b/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj index ae3b4549c..4e26a60c2 100644 --- a/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj +++ b/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj @@ -1,19 +1,19 @@ - - - Exe - true - - - - embedded - - - - embedded - - - - false - - - + + + Exe + true + + + + embedded + + + + embedded + + + + false + + + diff --git a/Penumbra.GameData b/Penumbra.GameData index 826bdc1cb..1db22f281 160000 --- a/Penumbra.GameData +++ b/Penumbra.GameData @@ -1 +1 @@ -Subproject commit 826bdc1cb1e448e215a21c64d8e4ae73a8743078 +Subproject commit 1db22f2819e655d51dcf86077670030399fd2cfb diff --git a/Penumbra.slnx b/Penumbra.slnx index 06b79f834..604735057 100644 --- a/Penumbra.slnx +++ b/Penumbra.slnx @@ -12,10 +12,12 @@ - + + - + + @@ -35,6 +37,16 @@ + + + + + + + + + + diff --git a/Penumbra/Api/Api/ModSettingsApi.cs b/Penumbra/Api/Api/ModSettingsApi.cs index 8bff18245..0deb0ac62 100644 --- a/Penumbra/Api/Api/ModSettingsApi.cs +++ b/Penumbra/Api/Api/ModSettingsApi.cs @@ -307,6 +307,7 @@ private void OnModOptionEdited(in ModOptionChanged.Arguments arguments) case ModOptionChangeType.OptionFilesAdded: case ModOptionChangeType.OptionSwapsChanged: case ModOptionChangeType.OptionMetaChanged: + case ModOptionChangeType.ConditionChanged: TriggerSettingEdited(arguments.Mod); break; } diff --git a/Penumbra/Api/DalamudSubstitutionProvider.cs b/Penumbra/Api/DalamudSubstitutionProvider.cs index 78bec4ef3..0787345e0 100644 --- a/Penumbra/Api/DalamudSubstitutionProvider.cs +++ b/Penumbra/Api/DalamudSubstitutionProvider.cs @@ -1,5 +1,6 @@ using Dalamud.Interface; using Dalamud.Plugin.Services; +using Penumbra.Collections.Cache; using Penumbra.Collections.Manager; using Penumbra.Communication; using Penumbra.Services; @@ -12,6 +13,7 @@ public class DalamudSubstitutionProvider : IDisposable, Luna.IApiService private readonly ITextureSubstitutionProvider _substitution; private readonly IUiBuilder _uiBuilder; private readonly ActiveCollectionData _activeCollectionData; + private readonly CollectionCacheManager _caches; // May be required to not be disposed on disposal. private readonly Configuration _config; private readonly CommunicatorService _communicator; @@ -19,10 +21,11 @@ public bool Enabled => _config.UseDalamudUiTextureRedirection; public DalamudSubstitutionProvider(ITextureSubstitutionProvider substitution, ActiveCollectionData activeCollectionData, - Configuration config, CommunicatorService communicator, IUiBuilder ui) + Configuration config, CommunicatorService communicator, IUiBuilder ui, CollectionCacheManager caches) { _substitution = substitution; _uiBuilder = ui; + _caches = caches; _activeCollectionData = activeCollectionData; _config = config; _communicator = communicator; @@ -43,10 +46,17 @@ public void ResetSubstitutions(IEnumerable paths) if (!_uiBuilder.UiPrepared) return; - var transformed = paths - .Where(p => (p.Path.StartsWith("ui/"u8) || p.Path.StartsWith("common/font/"u8)) && p.Path.EndsWith(".tex"u8)) - .Select(p => p.ToString()); - _substitution.InvalidatePaths(transformed); + try + { + var transformed = paths + .Where(p => (p.Path.StartsWith("ui/"u8) || p.Path.StartsWith("common/font/"u8)) && p.Path.EndsWith(".tex"u8)) + .Select(p => p.ToString()); + _substitution.InvalidatePaths(transformed); + } + catch (Exception ex) + { + Penumbra.Log.Error($"Failed to reset texture substitutions:\n{ex}"); + } } public void Enable() diff --git a/Penumbra/Api/IpcProviders.cs b/Penumbra/Api/IpcProviders.cs index 8e7ab0034..418e9d6ff 100644 --- a/Penumbra/Api/IpcProviders.cs +++ b/Penumbra/Api/IpcProviders.cs @@ -9,8 +9,13 @@ namespace Penumbra.Api; public sealed class IpcProviders : IDisposable, IApiService, IRequiredService { + private static readonly HashSet InternalCallers = []; + private readonly List _providers; + public static IReadOnlySet Callers + => InternalCallers; + private readonly EventProvider _disposedProvider; private readonly EventProvider _initializedProvider; private readonly CharacterUtility _characterUtility; @@ -77,9 +82,10 @@ public IpcProviders(IDalamudPluginInterface pi, IPenumbraApi api, CharacterUtili IpcSubscribers.ModSettingChanged.Provider(pi, api.ModSettings), IpcSubscribers.CopyModSettings.Provider(pi, api.ModSettings), - IpcSubscribers.ApiVersion.Provider(pi, api), - new FuncProvider<(int Major, int Minor)>(pi, "Penumbra.ApiVersions", () => api.ApiVersion), // backward compatibility - new FuncProvider(pi, "Penumbra.ApiVersion", () => api.ApiVersion.Breaking), // backward compatibility + IpcSubscribers.ApiVersion.Provider(pi, InternalCallers, api), + new FuncProvider<(int Major, int Minor)>(pi, InternalCallers, "Penumbra.ApiVersions", + () => api.ApiVersion), // backward compatibility + new FuncProvider(pi, InternalCallers, "Penumbra.ApiVersion", () => api.ApiVersion.Breaking), // backward compatibility IpcSubscribers.GetModDirectory.Provider(pi, api.PluginState), IpcSubscribers.GetConfiguration.Provider(pi, api.PluginState), IpcSubscribers.ModDirectoryChanged.Provider(pi, api.PluginState), @@ -111,11 +117,11 @@ public IpcProviders(IDalamudPluginInterface pi, IPenumbraApi api, CharacterUtili IpcSubscribers.GetGameObjectResourceTrees.Provider(pi, api.ResourceTree), IpcSubscribers.GetPlayerResourceTrees.Provider(pi, api.ResourceTree), - IpcSubscribers.CreateTemporaryCollection.Provider(pi, api.Temporary), + IpcSubscribers.CreateTemporaryCollection.Provider(pi, InternalCallers, api.Temporary), IpcSubscribers.DeleteTemporaryCollection.Provider(pi, api.Temporary), IpcSubscribers.AssignTemporaryCollection.Provider(pi, api.Temporary), - IpcSubscribers.AddTemporaryModAll.Provider(pi, api.Temporary), - IpcSubscribers.AddTemporaryMod.Provider(pi, api.Temporary), + IpcSubscribers.AddTemporaryModAll.Provider(pi, InternalCallers, api.Temporary), + IpcSubscribers.AddTemporaryMod.Provider(pi, InternalCallers, api.Temporary), IpcSubscribers.RemoveTemporaryModAll.Provider(pi, api.Temporary), IpcSubscribers.RemoveTemporaryMod.Provider(pi, api.Temporary), IpcSubscribers.SetTemporaryModSettings.Provider(pi, api.Temporary), diff --git a/Penumbra/Collections/Cache/CustomResourceCache.cs b/Penumbra/Collections/Cache/CustomResourceCache.cs index e63f86376..18eabbbc8 100644 --- a/Penumbra/Collections/Cache/CustomResourceCache.cs +++ b/Penumbra/Collections/Cache/CustomResourceCache.cs @@ -1,7 +1,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource; +using Luna; using Penumbra.Api.Enums; using Penumbra.Interop.Hooks.ResourceLoading; -using Penumbra.Interop.SafeHandles; using Penumbra.String.Classes; namespace Penumbra.Collections.Cache; diff --git a/Penumbra/Collections/Manager/ActiveCollectionMigration.cs b/Penumbra/Collections/Manager/ActiveCollectionMigration.cs index 3ec8ccffe..227205708 100644 --- a/Penumbra/Collections/Manager/ActiveCollectionMigration.cs +++ b/Penumbra/Collections/Manager/ActiveCollectionMigration.cs @@ -3,7 +3,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Penumbra.Files; -using Penumbra.Services; namespace Penumbra.Collections.Manager; @@ -19,7 +18,7 @@ public static void MigrateUngenderedCollections(FilenameService fileNames) { var oldName = type.ToString()[4..]; var value = jObject[oldName]; - if (value == null) + if (value is null) continue; jObject.Remove(oldName); diff --git a/Penumbra/Collections/Manager/ActiveCollections.cs b/Penumbra/Collections/Manager/ActiveCollections.cs index a7b0be5ee..a33876ef1 100644 --- a/Penumbra/Collections/Manager/ActiveCollections.cs +++ b/Penumbra/Collections/Manager/ActiveCollections.cs @@ -80,7 +80,7 @@ public ModCollection Interface /// Get the collection assigned to an individual or Default if unassigned. public ModCollection Individual(ActorIdentifier identifier) - => Individuals.TryGetCollection(identifier, out var c) ? c : Default; + => Individuals.TryGetCollection(identifier, out var c, false) ? c : Default; /// The list of group assignments. private ModCollection?[] SpecialCollections @@ -547,16 +547,16 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id) return $"Assignment is redundant due to overwriting Male Players and Female Players{racialString} with an identical collection.\nYou can remove it."; - if (male == null) + if (male is null) { - if (female == null && @base == yourself) + if (female is null && @base == yourself) return $"Assignment is redundant due to overwriting Base{racialString} with an identical collection.\nYou can remove it."; if (female == yourself && @base == yourself) return $"Assignment is redundant due to overwriting Base and Female Players{racialString} with an identical collection.\nYou can remove it."; } - else if (male == yourself && female == null && @base == yourself) + else if (male == yourself && female is null && @base == yourself) { return $"Assignment is redundant due to overwriting Base and Male Players{racialString} with an identical collection.\nYou can remove it."; @@ -570,7 +570,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id) case IdentifierType.Player when id.HomeWorld != ushort.MaxValue: { var global = ByType(CollectionType.Individual, _actors.CreatePlayer(id.PlayerName, ushort.MaxValue)); - return (global != null ? global.Identity.Index : null) == checkAssignment.Identity.Index + return global?.Identity.Index == checkAssignment.Identity.Index ? "Assignment is redundant due to an identical Any-World assignment existing.\nYou can remove it." : string.Empty; } @@ -579,12 +579,12 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id) { var global = ByType(CollectionType.Individual, _actors.CreateOwned(id.PlayerName, ushort.MaxValue, id.Kind, id.DataId)); - if ((global != null ? global.Identity.Index : null) == checkAssignment.Identity.Index) + if (global?.Identity.Index == checkAssignment.Identity.Index) return "Assignment is redundant due to an identical Any-World assignment existing.\nYou can remove it."; } var unowned = ByType(CollectionType.Individual, _actors.CreateNpc(id.Kind, id.DataId)); - return (unowned != null ? unowned.Identity.Index : null) == checkAssignment.Identity.Index + return unowned?.Identity.Index == checkAssignment.Identity.Index ? "Assignment is redundant due to an identical unowned NPC assignment existing.\nYou can remove it." : string.Empty; } @@ -606,7 +606,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id) collection1 = CollectionType.Default; } - if (femaleNpc == null) + if (femaleNpc is null) { femaleNpc = Default; if (femaleNpc.Identity.Index != checkAssignment.Identity.Index) @@ -626,7 +626,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id) foreach (var parentType in group) { var assignment = ByType(parentType); - if (assignment == null) + if (assignment is null) continue; if (assignment.Identity.Index == checkAssignment.Identity.Index) diff --git a/Penumbra/Collections/Manager/IndividualCollections.Access.cs b/Penumbra/Collections/Manager/IndividualCollections.Access.cs index d0a706300..564520bcf 100644 --- a/Penumbra/Collections/Manager/IndividualCollections.Access.cs +++ b/Penumbra/Collections/Manager/IndividualCollections.Access.cs @@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.Objects.Types; using Penumbra.GameData.Actors; using Penumbra.GameData.Enums; +using Penumbra.GameData.Interop; using Penumbra.String; namespace Penumbra.Collections.Manager; @@ -20,9 +21,9 @@ public int Count public (string DisplayName, ModCollection Collection) this[int index] => (_assignments[index].DisplayName, _assignments[index].Collection); - public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out ModCollection? collection) + public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out ModCollection? collection, bool hostile) { - if (Count == 0) + if (Count is 0) { collection = null; return false; @@ -53,7 +54,7 @@ public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out return true; // Handle Ownership. - if (!_config.UseOwnerNameForCharacterCollection) + if (!_config.UseOwnerNameForCharacterCollection || hostile && !_config.UseOwnerForHostiles) return false; identifier = _actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName, @@ -85,7 +86,7 @@ public enum SpecialResult public (ActorIdentifier, SpecialResult) ConvertSpecialIdentifier(ActorIdentifier identifier) { - if (identifier.Type != IdentifierType.Special) + if (identifier.Type is not IdentifierType.Special) return (identifier, SpecialResult.Invalid); if (_actors.ResolvePartyBannerPlayer(identifier.Special, out var id)) @@ -105,8 +106,7 @@ public enum SpecialResult return (_actors.GetCurrentPlayer(), SpecialResult.FittingRoom); case ScreenActor.DyePreview when _config.UseCharacterCollectionInTryOn: return (_actors.GetCurrentPlayer(), SpecialResult.DyePreview); - case ScreenActor.Portrait when _config.UseCharacterCollectionsInCards: - return (_actors.GetCurrentPlayer(), SpecialResult.Portrait); + case ScreenActor.Portrait when _config.UseCharacterCollectionsInCards: return (_actors.GetCurrentPlayer(), SpecialResult.Portrait); case ScreenActor.ExamineScreen: { identifier = _actors.GetInspectPlayer(); @@ -126,10 +126,11 @@ public enum SpecialResult } public bool TryGetCollection(IGameObject? gameObject, out ModCollection? collection) - => TryGetCollection(_actors.FromObject(gameObject, true, false, false), out collection); + => TryGetCollection(_actors.FromObject(gameObject, true, false, false), out collection, + gameObject is ICharacter c && c.StatusFlags.HasFlag(StatusFlags.Hostile)); public unsafe bool TryGetCollection(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject* gameObject, out ModCollection? collection) - => TryGetCollection(_actors.FromObject(gameObject, out _, true, false, false), out collection); + => TryGetCollection(_actors.FromObject(gameObject, out _, true, false, false), out collection, ((Actor)gameObject).IsHostile); private bool CheckWorlds(ActorIdentifier identifier, out ModCollection? collection) { diff --git a/Penumbra/Collections/ModCollectionSave.cs b/Penumbra/Collections/ModCollectionSave.cs index aa971e9c3..65c432768 100644 --- a/Penumbra/Collections/ModCollectionSave.cs +++ b/Penumbra/Collections/ModCollectionSave.cs @@ -4,7 +4,6 @@ using Penumbra.Files; using Penumbra.Mods.Manager; using Penumbra.Mods.Settings; -using Penumbra.Services; namespace Penumbra.Collections; @@ -29,10 +28,9 @@ public void Save(Stream stream) j.WriteNumber("Version"u8, ModCollection.CurrentVersion); j.WriteString("Id"u8, modCollection.Identity.Identifier); j.WriteString("Name"u8, modCollection.Identity.Name); - j.WritePropertyName("Settings"u8); // Write all used and unused settings by mod directory name. - j.WriteStartObject(); + j.WriteStartObject("Settings"u8); var list = new List<(string, ModSettings.SavedSettings)>(modCollection.Settings.Count + modCollection.Settings.Unused.Count); for (var i = 0; i < modCollection.Settings.Count; ++i) { diff --git a/Penumbra/Communication/ModDataChanged.cs b/Penumbra/Communication/ModDataChanged.cs index d8e8d07fb..01d651bf6 100644 --- a/Penumbra/Communication/ModDataChanged.cs +++ b/Penumbra/Communication/ModDataChanged.cs @@ -9,7 +9,7 @@ public sealed class ModDataChanged(LunaLogger log) : EventBase + /// ModFileSystemCache = -10, /// @@ -20,6 +20,9 @@ public enum Priority /// ModPanelHeader = 0, + + /// + GroupNameCache = 0, } /// The arguments for a ModDataChanged event. diff --git a/Penumbra/Communication/ModOptionChanged.cs b/Penumbra/Communication/ModOptionChanged.cs index ba5b25838..b0b050417 100644 --- a/Penumbra/Communication/ModOptionChanged.cs +++ b/Penumbra/Communication/ModOptionChanged.cs @@ -26,11 +26,14 @@ public enum Priority /// ItemSwapTab = 0, + /// + GroupNameCache = 0, + /// CollectionStorage = 100, - /// - ModGroupEditUpdater = 1000, + /// + LayoutManager = int.MaxValue, } /// The arguments for a ModOptionChanged event. @@ -39,7 +42,7 @@ public enum Priority /// The changed group inside the mod, if any. /// The changed option inside the group or null if it does not concern a specific option. /// The changed data container inside the group or null if it does not concern a specific data container. - /// The old name of the group or option for and . + /// The GUID of the changed object if available, empty otherwise. For and , the replaced GUID. /// The index of the group or option moved or deleted from. public readonly record struct Arguments( ModOptionChangeType Type, @@ -47,6 +50,6 @@ public readonly record struct Arguments( IModGroup? Group, IModOption? Option, IModDataContainer? Container, - string? OldName, + Guid Id, int DeletedIndex); } diff --git a/Penumbra/Communication/ModPathChanged.cs b/Penumbra/Communication/ModPathChanged.cs index 1319dcf52..c2f6ad01f 100644 --- a/Penumbra/Communication/ModPathChanged.cs +++ b/Penumbra/Communication/ModPathChanged.cs @@ -21,9 +21,6 @@ public enum Priority /// ApiModSettings = int.MinValue + 1, - /// - EphemeralConfig = -500, - /// CollectionCacheManagerAddition = -100, diff --git a/Penumbra/Config/Configuration.cs b/Penumbra/Config/Configuration.cs index ddde2f2a5..f781e3678 100644 --- a/Penumbra/Config/Configuration.cs +++ b/Penumbra/Config/Configuration.cs @@ -7,6 +7,7 @@ using Penumbra.Api.Enums; using Penumbra.Files; using Penumbra.Import.Structs; +using Penumbra.Import.Textures; using Penumbra.Interop.Services; using Penumbra.Services; using Penumbra.UI.Classes; @@ -68,6 +69,7 @@ public bool EnableMods public bool UseCharacterCollectionInInspect { get; set; } = true; public bool UseCharacterCollectionInTryOn { get; set; } = true; public bool UseOwnerNameForCharacterCollection { get; set; } = true; + public bool UseOwnerForHostiles { get; set; } = false; public bool UseNoModsInInspect { get; set; } = false; public bool HideChangedItemFilters { get; set; } = false; public bool ReplaceNonAsciiOnImport { get; set; } = false; @@ -77,6 +79,7 @@ public bool EnableMods public bool DefaultTemporaryMode { get; set; } = false; public bool EnableDirectoryWatch { get; set; } = false; public bool EnableAutomaticModImport { get; set; } = false; + public bool EnableContainerPeeking { get; set; } = true; public bool AutoDismissModImportSuccessReports { get; set; } = true; public bool AlwaysShowDetailedModImport { get; set; } = false; public bool PreventExportLoopback { get; set; } = true; @@ -108,6 +111,9 @@ public bool EnableMods [ConfigProperty(EventName = "ShowRenameChanged")] private RenameField _showRename = RenameField.BothDataPrio; + [ConfigProperty(EventName = "AuxiliaryDeviceModeChanged")] + private AuxiliaryDeviceMode _auxiliaryDeviceMode = AuxiliaryDeviceMode.Singleton; + public ChangedItemMode ChangedItemDisplay { get; set; } = ChangedItemMode.GroupedCollapsed; public int OptionGroupCollapsibleMin { get; set; } = 5; @@ -247,7 +253,7 @@ public string ToFilePath(FilenameService fileNames) public void Save(Stream stream) { - using var writer = new StreamWriter(stream); + using var writer = new StreamWriter(stream, leaveOpen: true); using var jWriter = new JsonTextWriter(writer); jWriter.Formatting = Formatting.Indented; var serializer = new JsonSerializer { Formatting = Formatting.Indented }; diff --git a/Penumbra/Config/EphemeralConfig.cs b/Penumbra/Config/EphemeralConfig.cs index 54611dc75..3056f6354 100644 --- a/Penumbra/Config/EphemeralConfig.cs +++ b/Penumbra/Config/EphemeralConfig.cs @@ -17,6 +17,8 @@ public sealed partial class EphemeralConfig : ISavable, IService [JsonIgnore] private readonly SaveService _saveService; + private bool _init; + public int Version { get; set; } = Configuration.Constants.CurrentVersion; public int LastSeenVersion { get; set; } = PenumbraChangelog.LastChangelogVersion; public bool DebugSeparateWindow { get; set; } = false; @@ -59,6 +61,7 @@ static void HandleDeserializationError(object? sender, ErrorEventArgs errorArgs) try { var text = File.ReadAllText(_saveService.FileNames.EphemeralConfigFile); + _init = true; JsonConvert.PopulateObject(text, this, new JsonSerializerSettings { Error = HandleDeserializationError, @@ -70,11 +73,16 @@ static void HandleDeserializationError(object? sender, ErrorEventArgs errorArgs) "Error reading ephemeral Configuration, reverting to default.", "Error reading ephemeral Configuration", NotificationType.Error); } + + _init = false; } /// Save the current configuration. public void Save() - => _saveService.DelaySave(this, TimeSpan.FromSeconds(5)); + { + if (!_init) + _saveService.DelaySave(this, TimeSpan.FromSeconds(5)); + } public string ToFilePath(FilenameService fileNames) @@ -82,7 +90,7 @@ public string ToFilePath(FilenameService fileNames) public void Save(Stream stream) { - using var writer = new StreamWriter(stream); + using var writer = new StreamWriter(stream, leaveOpen: true); using var jWriter = new JsonTextWriter(writer); jWriter.Formatting = Formatting.Indented; var serializer = new JsonSerializer { Formatting = Formatting.Indented }; diff --git a/Penumbra/Config/FilterConfig.cs b/Penumbra/Config/FilterConfig.cs index 1999b79a8..d0b4e0a21 100644 --- a/Penumbra/Config/FilterConfig.cs +++ b/Penumbra/Config/FilterConfig.cs @@ -4,7 +4,6 @@ using Newtonsoft.Json.Linq; using Penumbra.Enums; using Penumbra.Files; -using Penumbra.Services; using Penumbra.UI.Classes; using Penumbra.UI.ModsTab.Selector; using Penumbra.UI.ResourceWatcher; @@ -338,7 +337,7 @@ private void LoadResourceWatcherTab(JObject j) _resourceLoggerCategoryFilter = resourceWatcher["CategoryFilter"]?.Value() is { } categoryFilter ? (ResourceCategoryFlag)categoryFilter : ResourceExtensions.AllResourceCategories; - _resourceLoggerTypeFilter = resourceWatcher["TypeFilter"]?.Value() is { } typeFilter + _resourceLoggerTypeFilter = resourceWatcher["TypeFilter"]?.Value() is { } typeFilter ? (ResourceTypeFlag)typeFilter : ResourceExtensions.AllResourceTypes; _resourceLoggerLoadStateFilter = resourceWatcher["LoadStateFilter"]?.Value() is { } loadStateFilter diff --git a/Penumbra/Config/UiConfig.cs b/Penumbra/Config/UiConfig.cs index 6f7792cbc..375c3fb23 100644 --- a/Penumbra/Config/UiConfig.cs +++ b/Penumbra/Config/UiConfig.cs @@ -3,7 +3,6 @@ using Luna.Generators; using Newtonsoft.Json.Linq; using Penumbra.Files; -using Penumbra.Services; using MessageService = Penumbra.Services.MessageService; namespace Penumbra; diff --git a/Penumbra/Files/GroupDeserialization.cs b/Penumbra/Files/GroupDeserialization.cs new file mode 100644 index 000000000..b39f7c9df --- /dev/null +++ b/Penumbra/Files/GroupDeserialization.cs @@ -0,0 +1,594 @@ +using System.Text.Json; +using Dalamud.Interface.ImGuiNotification; +using Luna; +using Penumbra.Api.Enums; +using Penumbra.GameData.Structs; +using Penumbra.Mods.Groups; +using Penumbra.Mods.Settings; +using Penumbra.Mods.SubMods; +using Penumbra.String; +using Penumbra.String.Classes; + +namespace Penumbra.Files; + +public static class GroupDeserialization +{ + public static IModGroup? ReadGroup(ModDeserialization.Context context, ref Utf8JsonReader reader, string filePath) + { + if (reader.TokenType is JsonTokenType.Null) + return null; + + if (reader.TokenType is not JsonTokenType.StartObject) + throw new InvalidMetaException(context.Mod, filePath, $"Object start for group expected, but got {reader.TokenType}."); + + var groupReader = reader.CreateObjectLimit(); + if (reader.TryPeekEnumProperty("Type"u8, out GroupType type) is not JsonFunctions.PeekError.Success) + type = GroupType.Single; + + return type switch + { + GroupType.Single => ReadSingle(context, groupReader, ref reader), + GroupType.Multi => ReadMulti(context, groupReader, ref reader), + GroupType.Imc => ReadImc(context, groupReader, ref reader), + GroupType.Combining => ReadCombining(context, groupReader, ref reader), + _ => throw new JsonException($"{type} is not a valid group type for mod {context.Mod.Name}."), + }; + } + + public static void ReadDefaultContainer(ModDeserialization.Context context, ref Utf8JsonReader reader, string filePath) + { + if (reader.TokenType is JsonTokenType.Null) + { + context.Mod.Default.Files.Clear(); + context.Mod.Default.FileSwaps.Clear(); + context.Mod.Default.Manipulations.Clear(); + return; + } + + if (reader.TokenType is not JsonTokenType.StartObject) + throw new InvalidMetaException(context.Mod, filePath, + $"Object start for default container expected, but got {reader.TokenType}."); + + var containerReader = reader.CreateObjectLimit(); + var visited = 0; + while (containerReader.Read(ref reader)) + { + if (reader.TokenType is not JsonTokenType.PropertyName) + throw new InvalidMetaException(context.Mod, filePath, "Property name expected."); + + if (!LoadDataContainer(ref reader, context.Mod.Default, context.Mod.ModPath, ref visited)) + reader.Skip(); + } + + if ((visited & 1) is not 1) + context.Mod.Default.Files.Clear(); + if ((visited & 2) is not 2) + context.Mod.Default.FileSwaps.Clear(); + if ((visited & 4) is not 4) + context.Mod.Default.Manipulations.Clear(); + } + + public static IModGroup? ReadGroupFile(SaveService saveService, ModDeserialization.Context context, FileInfo file) + => IJsonParsable.ReadJson(saveService, file.FullName, true, context).Group; + + public static void ReadDefaultContainerFile(SaveService saveService, ModDeserialization.Context context) + { + var file = saveService.FileNames.OptionGroupFile(context.Mod, -1, false); + if (!File.Exists(file)) + { + context.Mod.Default.Files.Clear(); + context.Mod.Default.FileSwaps.Clear(); + context.Mod.Default.Manipulations.Clear(); + return; + } + + IJsonParsable.ReadJson(saveService, file, true, context); + } + + public static MultiModGroup ReadMulti(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j) + { + var ret = new MultiModGroup(context.Mod); + while (groupReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.ArrayProperty("Options"u8, out var array, true)) + LoadMultiOptions(context, array, ref j, ret); + else if (!ReadJsonBase(context, ref j, ret)) + j.Skip(); + } + + ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings); + + return ret; + } + + public static SingleModGroup ReadSingle(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j) + { + var ret = new SingleModGroup(context.Mod); + while (groupReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.ArrayProperty("Options"u8, out var array, true)) + LoadSingleOptions(context, array, ref j, ret); + else if (!ReadJsonBase(context, ref j, ret)) + j.Skip(); + } + + ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings); + + return ret; + } + + public static ImcModGroup? ReadImc(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j) + { + var ret = new ImcModGroup(context.Mod); + while (groupReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.ArrayProperty("Options"u8, out var array, true)) + LoadImcOptions(context, array, ref j, ret); + else if (j.ObjectProperty("Identifier"u8, out var identifier)) + ret.Identifier = MetaDeserialization.ReadImc(identifier, ref j, out _) ?? default; + else if (j.ObjectProperty("DefaultEntry"u8, out var entry)) + ret.DefaultEntry = MetaDeserialization.ReadImcEntry(entry, ref j) ?? new ImcEntry(); + else if (j.BoolProperty("AllVariants"u8, out var allVariants)) + ret.AllVariants = allVariants; + else if (j.BoolProperty("OnlyAttributes"u8, out var onlyAttributes)) + ret.OnlyAttributes = onlyAttributes; + else if (!ReadJsonBase(context, ref j, ret)) + j.Skip(); + } + + if (ret.Identifier.ObjectType is GameData.Enums.ObjectType.Unknown || ret.DefaultEntry.MaterialId is 0) + { + Penumbra.Messager.NotificationMessage($"Could not add IMC group {ret.Name} because the associated IMC Entry is invalid.", + NotificationType.Warning); + return null; + } + + ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings); + return ret; + } + + public static CombiningModGroup ReadCombining(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j) + { + var ret = CombiningModGroup.EmptyData(context.Mod); + while (groupReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.ArrayProperty("Options"u8, out var array, true)) + LoadCombiningOptions(context, array, ref j, ret); + else if (j.ArrayProperty("Containers"u8, out var containers, true)) + LoadCombiningContainers(containers, ref j, ret); + else if (!ReadJsonBase(context, ref j, ret)) + j.Skip(); + } + + var requiredContainers = 1 << ret.OptionData.Count; + if (requiredContainers > ret.Data.Count) + { + Penumbra.Messager.NotificationMessage( + $"Combining Group {ret.Name} in {context.Mod.Name} has not enough data containers for its {ret.OptionData.Count} options, filling with empty containers.", + NotificationType.Warning); + ret.Data.EnsureCapacity(requiredContainers); + ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count).Select(_ => new CombinedDataContainer(ret))); + } + else if (requiredContainers < ret.Data.Count) + { + Penumbra.Messager.NotificationMessage( + $"Combining Group {ret.Name} in {context.Mod.Name} has more than {IModGroup.MaxCombiningOptions} options, ignoring excessive options.", + NotificationType.Warning); + ret.Data.RemoveRange(requiredContainers, ret.Data.Count - requiredContainers); + } + + ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings); + return ret; + } + + + private static void LoadSingleOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j, + SingleModGroup ret) + { + while (optionArray.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.StartObject) + throw new JsonException("New Object expected."); + + var option = new SingleSubMod(ret); + var optionReader = j.CreateObjectLimit(); + var visited = 0; + while (optionReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (LoadOptionData(context, ref j, option)) + continue; + + if (LoadDataContainer(ref j, option, ret.Mod.ModPath, ref visited)) + continue; + + j.Skip(); + } + + ret.OptionData.Add(option); + } + } + + private static void LoadMultiOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j, + MultiModGroup ret) + { + var warned = false; + var visited = 0; + while (optionArray.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.StartObject) + throw new JsonException("New Object expected."); + + if (ret.OptionData.Count is IModGroup.MaxMultiOptions) + { + if (!warned) + continue; + + Penumbra.Messager.NotificationMessage( + $"Multi Group {ret.Name} in {ret.Mod.Name} has more than {IModGroup.MaxMultiOptions} options, ignoring excessive options.", + NotificationType.Warning); + warned = true; + } + else + { + var option = new MultiSubMod(ret); + var optionReader = j.CreateObjectLimit(); + while (optionReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.NumberProperty("Priority"u8, out int priority)) + { + option.Priority = new ModPriority(priority); + continue; + } + + if (LoadOptionData(context, ref j, option)) + continue; + + if (LoadDataContainer(ref j, option, ret.Mod.ModPath, ref visited)) + continue; + + j.Skip(); + } + + ret.OptionData.Add(option); + } + } + } + + private static void LoadImcOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j, + ImcModGroup ret) + { + var rollingMask = 0ul; + while (optionArray.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.StartObject) + throw new JsonException("New Object expected."); + + var option = new ImcSubMod(ret); + var optionReader = j.CreateObjectLimit(); + while (optionReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.NumberProperty("AttributeMask"u8, out ushort mask)) + { + option.AttributeMask = (ushort)(mask & ImcEntry.AttributesMask); + continue; + } + + if (j.BoolProperty("IsDisableSubMod"u8, out var isDisable)) + { + option.IsDisableSubMod = isDisable; + continue; + } + + if (LoadOptionData(context, ref j, option)) + continue; + + j.Skip(); + } + + if (option.IsDisableSubMod && ret.OptionData.FirstOrDefault(m => m.IsDisableSubMod) is { } disable) + { + Penumbra.Messager.NotificationMessage( + $"Could not add IMC option {option.Name} to {ret.Name} because it already contains {disable.Name} as disable option.", + NotificationType.Warning); + } + else if ((option.AttributeMask & rollingMask) is not 0) + { + Penumbra.Messager.NotificationMessage( + $"Could not add IMC option {option.Name} to {ret.Name} because it contains attributes already in use.", + NotificationType.Warning); + } + else + { + rollingMask |= option.AttributeMask; + ret.OptionData.Add(option); + if (option.IsDisableSubMod) + ret.CanBeDisabled = true; + } + } + } + + private static void LoadCombiningOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j, + CombiningModGroup ret) + { + var warned = false; + while (optionArray.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.StartObject) + throw new JsonException("New Object expected."); + + if (ret.OptionData.Count is IModGroup.MaxCombiningOptions) + { + if (warned) + continue; + + Penumbra.Messager.NotificationMessage( + $"Combining Group {ret.Name} in {ret.Mod.Name} has more than {IModGroup.MaxCombiningOptions} options, ignoring excessive options.", + NotificationType.Warning); + warned = true; + } + else + { + var option = new CombiningSubMod(ret); + var optionReader = j.CreateObjectLimit(); + while (optionReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (LoadOptionData(context, ref j, option)) + continue; + + j.Skip(); + } + + ret.OptionData.Add(option); + } + } + } + + private static void LoadCombiningContainers(Utf8JsonObjectLimit containerArray, ref Utf8JsonReader j, CombiningModGroup ret) + { + var visited = 0; + while (containerArray.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.StartObject) + throw new JsonException("New Object expected."); + + var container = new CombinedDataContainer(ret); + var containerReader = j.CreateObjectLimit(); + while (containerReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (j.StringProperty("Name"u8, out string? name, true)) + { + container.Name = name ?? string.Empty; + continue; + } + + if (LoadDataContainer(ref j, container, ret.Mod.ModPath, ref visited)) + continue; + + j.Skip(); + } + + ret.Data.Add(container); + } + } + + /// Load the relevant data for a selectable option from a JToken of that option. + [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)] + private static bool LoadOptionData(ModDeserialization.Context context, ref Utf8JsonReader j, IModOption option) + { + if (ReadJsonObject(context, ref j, option)) + return true; + + if (j.NumberProperty("Color"u8, out int number)) + { + option.Color = IModOption.ConvertColor(number); + return true; + } + + return false; + } + + /// Load all file redirections, file swaps and meta manipulations from a JToken of that option into a data container. + [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)] + private static unsafe bool LoadDataContainer(ref Utf8JsonReader j, IModDataContainer data, DirectoryInfo basePath, ref int visited) + { + Span buffer = stackalloc byte[Utf8GamePath.MaxGamePathLength + 1]; + if (j.ObjectProperty("Files"u8, out var files, true)) + { + data.Files.Clear(); + while (files.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException($"Expected property in file dictionary, got {j.TokenType}."); + + var length = j.CopyString(buffer); + buffer[length] = 0; + if (length is 0 || !Utf8GamePath.FromSpan(buffer[..length], MetaDataComputation.All, out var gamePathTmp)) + continue; + + if (!j.Read() || !j.TryReadString(out var rel) || !Utf8RelPath.FromString(rel, out var relPath)) + throw new JsonException($"Expected relative path in file dictionary for key {gamePathTmp}."); + + data.Files.TryAdd(gamePathTmp.Clone(), new FullPath(basePath, relPath)); + } + + visited |= 1; + return true; + } + + if (j.ObjectProperty("FileSwaps"u8, out var swaps, true)) + { + data.FileSwaps.Clear(); + while (swaps.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + throw new JsonException($"Expected property in file dictionary, got {j.TokenType}."); + + var length = j.CopyString(buffer); + buffer[length] = 0; + if (length is 0 || !Utf8GamePath.FromSpan(buffer[..length], MetaDataComputation.All, out var gamePathTmp)) + continue; + + if (!j.Read() || !j.TryReadString(out var swap)) + throw new JsonException($"Expected game path in file swap dictionary for key {gamePathTmp}."); + + data.FileSwaps.TryAdd(gamePathTmp.Clone(), new FullPath(swap!)); + } + + visited |= 2; + return true; + } + + if (j.ArrayProperty("Manipulations"u8, out _, true)) + { + data.Manipulations = MetaDeserialization.ReadMetaDictionary(ref j, data); + visited |= 4; + return true; + } + + return false; + } + + private static bool ReadJsonObject(ModDeserialization.Context context, ref Utf8JsonReader j, IModObject @object) + { + if (j.StringProperty("Name"u8, out string? name, true)) + { + @object.Name = name ?? string.Empty; + return true; + } + + if (j.StringProperty("Description"u8, out string? description, true)) + { + @object.Description = description ?? string.Empty; + return true; + } + + if (j.GuidProperty("Id"u8, out var id)) + { + @object.Id = id; + return true; + } + + if (j.ArrayProperty("Layout"u8, out _, true)) + { + @object.Layout = j.ReadFlagEnumArray()?.Reduce(@object) ?? ModSettingsLayout.None; + return true; + } + + if (j.ObjectProperty("Condition"u8, out _, true)) + { + if (j.TokenType is JsonTokenType.Null) + { + @object.Condition = null; + return true; + } + + if (!ConditionParser.TryParse(ref j, out var condition)) + throw new JsonException("Could not parse condition."); + + if (condition?.Reduce() is { } c and not TrueCondition) + context.Conditions[@object] = c; + else + @object.Condition = null; + + return true; + } + + return false; + } + + private static bool ReadJsonBase(ModDeserialization.Context context, ref Utf8JsonReader j, IModGroup group) + { + if (ReadJsonObject(context, ref j, group)) + return true; + + if (j.StringProperty("Image"u8, out string? image, true)) + { + group.Image = image ?? string.Empty; + return true; + } + + if (j.NumberProperty("Page"u8, out int page)) + { + group.Page = page; + return true; + } + + if (j.NumberProperty("Priority"u8, out int priority)) + { + group.Priority = new ModPriority(priority); + return true; + } + + if (j.NumberProperty("DefaultSettings"u8, out ulong settings)) + { + group.DefaultSettings = new Setting(settings); + return true; + } + + if (j.GuidProperty("ParentSettings"u8, out var parent)) + { + context.Parents[group] = parent; + return true; + } + + return false; + } + + private struct GroupIntermediate : IJsonParsable + { + public IModGroup? Group; + + public static GroupIntermediate Read(ref Utf8JsonReader j, string filePath, object? parent) + { + if (parent is not ModDeserialization.Context context) + throw new ArgumentException("The user input for reading a mod group has to be the deserialization context."); + + if (!j.Read()) + throw new InvalidMetaException(context.Mod, filePath, "Empty or malformed JSON encountered."); + + return new GroupIntermediate { Group = ReadGroup(context, ref j, filePath) }; + } + } + + private struct DefaultOptionIntermediate : IJsonParsable + { + public static DefaultOptionIntermediate Read(ref Utf8JsonReader j, string filePath, object? parent) + { + if (parent is not ModDeserialization.Context context) + throw new ArgumentException("The user input for reading a default option has to be the deserialization context."); + + if (!j.Read()) + throw new InvalidMetaException(context.Mod, filePath, "Empty or malformed JSON encountered."); + + ReadDefaultContainer(context, ref j, filePath); + return default; + } + } +} diff --git a/Penumbra/Files/GroupSerialization.cs b/Penumbra/Files/GroupSerialization.cs new file mode 100644 index 000000000..068cf1733 --- /dev/null +++ b/Penumbra/Files/GroupSerialization.cs @@ -0,0 +1,196 @@ +using System.Text.Json; +using ImSharp; +using Luna; +using Penumbra.Mods; +using Penumbra.Mods.Groups; +using Penumbra.Mods.SubMods; +using Penumbra.UI.Classes; + +namespace Penumbra.Files; + +public static class GroupSerialization +{ + public static void WriteDefaultContainer(Utf8JsonWriter j, Mod mod, DirectoryInfo? basePath = null) + { + if (ContainerEmpty(mod.Default)) + return; + + j.WriteStartObject("DefaultData"u8); + FillContainer(j, mod.Default, basePath ?? mod.ModPath); + j.WriteEndObject(); + } + + public static void WriteGroup(Utf8JsonWriter j, IModGroup group, DirectoryInfo? basePath = null) + { + j.WriteStartObject(); + FillGroup(j, group, basePath); + j.WriteEndObject(); + } + + public static void FillGroup(Utf8JsonWriter j, IModGroup group, DirectoryInfo? basePath = null) + { + j.WriteString("Type"u8, group.Type.StringU8); + FillSubObject(j, group); + j.WriteSignedIfNot("Priority"u8, group.Priority.Value, 0); + j.WriteNonEmptyString("Image"u8, group.Image); + j.WriteSignedIfNot("Page"u8, group.Page, 0); + j.WriteUnsignedIfNot("DefaultSettings"u8, group.DefaultSettings.Value, 0ul); + if (group.ParentSetting is {} parent) + j.WriteString("ParentSetting"u8, parent.Id); + + basePath ??= group.Mod.ModPath; + switch (group) + { + case SingleModGroup single: + if (group.Options.Count > 0) + { + j.WriteStartArray("Options"u8); + foreach (var option in single.OptionData) + { + j.WriteStartObject(); + FillOption(j, option, basePath); + FillContainer(j, option, basePath); + j.WriteEndObject(); + } + + j.WriteEndArray(); + } + + break; + case MultiModGroup multi: + if (group.Options.Count > 0) + { + j.WriteStartArray("Options"u8); + foreach (var option in multi.OptionData) + { + j.WriteStartObject(); + FillOption(j, option, basePath); + j.WriteSignedIfNot("Priority"u8, option.Priority.Value, 0); + FillContainer(j, option, basePath); + j.WriteEndObject(); + } + + j.WriteEndArray(); + } + + break; + case ImcModGroup imc: + j.WriteStartObject("Identifier"u8); + imc.Identifier.AddToJson(j); + j.WriteEndObject(); + j.WritePropertyName("DefaultEntry"u8); + imc.DefaultEntry.WriteJson(j); + j.WriteBoolIf("AllVariants"u8, imc.AllVariants, false); + j.WriteBoolIf("OnlyAttributes"u8, imc.OnlyAttributes, false); + if (imc.OptionData.Count > 0) + { + j.WriteStartArray("Options"u8); + foreach (var option in imc.OptionData) + { + j.WriteStartObject(); + FillOption(j, option, basePath); + if (option.IsDisableSubMod) + j.WriteBoolean("IsDisableSubMod"u8, true); + else + j.WriteNumber("AttributeMask"u8, option.AttributeMask); + j.WriteEndObject(); + } + + j.WriteEndArray(); + } + + break; + case CombiningModGroup combining: + if (group.Options.Count > 0) + { + j.WriteStartArray("Options"u8); + foreach (var option in combining.OptionData) + { + j.WriteStartObject(); + FillOption(j, option, basePath); + j.WriteEndObject(); + } + + j.WriteEndArray(); + } + + j.WriteStartArray("Containers"u8); + foreach (var container in combining.Data) + { + j.WriteStartObject(); + j.WriteNonEmptyString("Name"u8, container.Name); + FillContainer(j, container, basePath); + j.WriteEndObject(); + } + + j.WriteEndArray(); + break; + } + } + + public static void FillOption(Utf8JsonWriter j, IModOption option, DirectoryInfo? basePath = null) + { + FillSubObject(j, option); + WriteOptionColor(j, option); + } + + public static void FillSubObject(Utf8JsonWriter j, IModObject @object) + { + j.WriteString("Id"u8, @object.Id); + j.WriteString("Name"u8, @object.Name); + j.WriteNonEmptyString("Description"u8, @object.Description); + if (@object.Layout is not ModSettingsLayout.None) + { + j.WriteStartArray("Layout"u8); + foreach (var layout in @object.Layout.Iterate()) + j.WriteStringValue(layout.StringU8); + j.WriteEndArray(); + } + + if (@object.Condition is not null) + { + j.WritePropertyName("Condition"u8); + @object.Condition.WriteJson(j); + } + } + + public static void FillContainer(Utf8JsonWriter j, IModDataContainer container, DirectoryInfo basePath) + { + if (container.Files.Count > 0) + { + j.WriteStartObject("Files"u8); + foreach (var (gamePath, file) in container.Files) + { + if (file.ToRelPath(basePath, out var relPath)) + j.WriteString(gamePath.Path.Span, relPath.Path.Span); + } + + j.WriteEndObject(); + } + + if (container.FileSwaps.Count > 0) + { + j.WriteStartObject("FileSwaps"u8); + foreach (var (gamePath, file) in container.FileSwaps) + j.WriteString(gamePath.Path.Span, file.InternalName.Span); + + j.WriteEndObject(); + } + + if (container.Manipulations.Count > 0) + { + j.WritePropertyName("Manipulations"u8); + MetaSerialization.WriteMetaDictionary(j, container.Manipulations); + } + } + + public static bool ContainerEmpty(IModDataContainer? container) + => container is null || container.Files.Count is 0 && container.FileSwaps.Count is 0 && container.Manipulations.Count is 0; + + private static void WriteOptionColor(Utf8JsonWriter j, IModOption option) + { + var c = option.ColorAsInteger; + if (c is not 0) + j.WriteNumber("Color"u8, c); + } +} diff --git a/Penumbra/Files/MetaDeserialization.cs b/Penumbra/Files/MetaDeserialization.cs new file mode 100644 index 000000000..beb9953f8 --- /dev/null +++ b/Penumbra/Files/MetaDeserialization.cs @@ -0,0 +1,653 @@ +using System.Text.Json; +using ImSharp; +using Luna; +using Penumbra.GameData.Enums; +using Penumbra.GameData.Files.AtchStructs; +using Penumbra.GameData.Structs; +using Penumbra.Meta; +using Penumbra.Meta.Manipulations; +using Penumbra.Mods.SubMods; + +namespace Penumbra.Files; + +public static class MetaDeserialization +{ + public static MetaDictionary ReadMetaDictionary(ref Utf8JsonReader reader, IModDataContainer? container) + { + var ret = new MetaDictionary(); + // Null, empty. + if (reader.TokenType is JsonTokenType.Null) + return ret; + + if (reader.TokenType is not JsonTokenType.StartArray) + throw new JsonException($"Meta Dictionary must be an array but starts with {reader.TokenType}."); + + var arrayReader = reader.CreateObjectLimit(); + var objectCount = 0; + + while (arrayReader.Read(ref reader)) + { + // Invalid. + if (reader.TokenType is not JsonTokenType.StartObject) + throw new JsonException($"Every meta entry must be an object, but encountered {reader.TokenType}."); + + var objectReader = reader.CreateObjectLimit(); + ++objectCount; + + // Try to get the type. Skip the respective object if it has an invalid or no type, but keep reading the dictionary. + switch (reader.TryPeekEnumProperty("Type"u8, out MetaManipulationType type)) + { + case JsonFunctions.PeekError.Invalid: + if (container is not null) + Penumbra.Log.Warning( + $"Invalid manipulation type encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}."); + else + Penumbra.Log.Warning($"Invalid manipulation type encountered in manipulation {objectCount}."); + + while (objectReader.Read(ref reader)) + ; // Skip current object. + continue; + case JsonFunctions.PeekError.Missing: + if (container is not null) + Penumbra.Log.Warning( + $"Manipulation without type encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}."); + else + Penumbra.Log.Warning($"Manipulation without type encountered in manipulation {objectCount}."); + + while (objectReader.Read(ref reader)) + ; // Skip current object. + continue; + // Malformed JSON can not be ignored, throw. + case JsonFunctions.PeekError.Malformed: + if (container is not null) + throw new JsonException( + $"Meta Dictionary with malformed JSON encountered in {container.Mod.Name} - {container.GetFullName()}."); + + throw new JsonException("Meta Dictionary with malformed JSON encountered."); + } + + try + { + AddSingleManipulation(container, objectReader, ref reader, ret, type); + } + catch (Exception ex) + { + if (container is not null) + Penumbra.Log.Warning( + $"Invalid manipulation encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}:\n{ex}"); + else + Penumbra.Log.Warning($"Invalid manipulation encountered in manipulation {objectCount}:\n{ex}"); + } + + // Make sure the current manipulation object is finished. + while (objectReader.Read(ref reader)) + ; + } + + return ret; + } + + public static EqpIdentifier? ReadEqp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EqpEntry? entry) + { + entry = null; + var setId = PrimaryId.Zero; + var slot = EquipSlot.Unknown; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Slot"u8, out EquipSlot s)) + slot = s; + else if (j.NumberProperty("SetId"u8, out ushort i)) + setId = new PrimaryId(i); + else if (j.NumberProperty("Entry"u8, out ulong e)) + entry = (EqpEntry)e; + else + j.Skip(); + } + + var ret = new EqpIdentifier(setId, slot); + return ret.Validate() ? ret : null; + } + + public static EqdpIdentifier? ReadEqdp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EqdpEntry? entry) + { + entry = null; + var gender = Gender.Unknown; + var race = ModelRace.Unknown; + var setId = PrimaryId.Zero; + var slot = EquipSlot.Unknown; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Gender"u8, out Gender g)) + gender = g; + else if (j.EnumProperty("Race"u8, out ModelRace r)) + race = r; + else if (j.EnumProperty("Slot"u8, out EquipSlot s)) + slot = s; + else if (j.NumberProperty("SetId"u8, out ushort i)) + setId = new PrimaryId(i); + else if (j.NumberProperty("Entry"u8, out ushort e)) + entry = (EqdpEntry)e; + else + j.Skip(); + } + + var ret = new EqdpIdentifier(setId, slot, Names.CombinedRace(gender, race)); + return ret.Validate() ? ret : null; + } + + public static EstIdentifier? ReadEst(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EstEntry? entry) + { + entry = null; + var gender = Gender.Unknown; + var race = ModelRace.Unknown; + var setId = PrimaryId.Zero; + var slot = default(EstType); + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Gender"u8, out Gender g)) + gender = g; + else if (j.EnumProperty("Race"u8, out ModelRace r)) + race = r; + else if (j.EnumProperty("Slot"u8, out EstType s)) + slot = s; + else if (j.NumberProperty("SetId"u8, out ushort i)) + setId = new PrimaryId(i); + else if (j.NumberProperty("Entry"u8, out ushort e)) + entry = new EstEntry(e); + else + j.Skip(); + } + + var ret = new EstIdentifier(setId, slot, Names.CombinedRace(gender, race)); + return ret.Validate() ? ret : null; + } + + public static GmpEntry? ReadGmpEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j) + { + var enabled = false; + var animated = false; + ushort rotationA = 0; + ushort rotationB = 0; + ushort rotationC = 0; + byte unknownA = 0; + byte unknownB = 0; + + while (entryReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.BoolProperty("Enabled"u8, out var e)) + enabled = e; + else if (j.BoolProperty("Animated"u8, out var a)) + animated = a; + else if (j.NumberProperty("RotationA"u8, out ushort ra)) + rotationA = ra; + else if (j.NumberProperty("RotationB"u8, out ushort rb)) + rotationB = rb; + else if (j.NumberProperty("RotationC"u8, out ushort rc)) + rotationC = rc; + else if (j.NumberProperty("UnknownA"u8, out byte ua)) + unknownA = ua; + else if (j.NumberProperty("UnknownB"u8, out byte ub)) + unknownB = ub; + else + j.Skip(); + } + + return new GmpEntry + { + Enabled = enabled, + Animated = animated, + RotationA = rotationA, + RotationB = rotationB, + RotationC = rotationC, + UnknownA = unknownA, + UnknownB = unknownB, + }; + } + + public static GmpIdentifier? ReadGmp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out GmpEntry? entry) + { + entry = null; + var setId = PrimaryId.Zero; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.NumberProperty("SetId"u8, out ushort i)) + setId = new PrimaryId(i); + else if (j.ObjectProperty("Entry"u8, out var entryReader)) + entry = ReadGmpEntry(entryReader, ref j); + else + j.Skip(); + } + + var ret = new GmpIdentifier(setId); + return ret.Validate() ? ret : null; + } + + public static RspIdentifier? ReadRsp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out RspEntry? entry) + { + entry = null; + var subRace = SubRace.Unknown; + var attribute = RspAttribute.NumAttributes; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("SubRace"u8, out SubRace s)) + subRace = s; + else if (j.EnumProperty("Attribute"u8, out RspAttribute a)) + attribute = a; + else if (j.NumberProperty("Entry"u8, out float e)) + entry = new RspEntry(e); + else + j.Skip(); + } + + var ret = new RspIdentifier(subRace, attribute); + return ret.Validate() ? ret : null; + } + + public static AtchEntry? ReadAtchEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j) + { + var ret = new AtchEntry(); + + while (entryReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.StringProperty("Bone"u8, out StringU8 bone)) + { + if (bone.Length is not 0 && ret.SetBoneName(bone)) + continue; + + j.SkipCurrentObject(); + return null; + } + + if (j.NumberProperty("Scale"u8, out float s)) + ret.Scale = s; + else if (j.NumberProperty("OffsetX"u8, out float ox)) + ret.OffsetX = ox; + else if (j.NumberProperty("OffsetY"u8, out float oy)) + ret.OffsetY = oy; + else if (j.NumberProperty("OffsetZ"u8, out float oz)) + ret.OffsetZ = oz; + else if (j.NumberProperty("RotationX"u8, out float rx)) + ret.RotationX = rx; + else if (j.NumberProperty("RotationY"u8, out float ry)) + ret.RotationY = ry; + else if (j.NumberProperty("RotationZ"u8, out float rz)) + ret.RotationZ = rz; + else + j.Skip(); + } + + if (ret.Bone.Length is 0) + return null; + + return ret; + } + + + public static AtchIdentifier? ReadAtch(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out AtchEntry? entry) + { + entry = null; + var gender = Gender.Unknown; + var race = ModelRace.Unknown; + var type = AtchType.Unknown; + ushort index = 0; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Gender"u8, out Gender g)) + gender = g; + else if (j.EnumProperty("Race"u8, out ModelRace r)) + race = r; + else if (j.NumberProperty("Index"u8, out ushort i)) + index = i; + else if (j.StringProperty("Type"u8, out StringU8 value)) + type = AtchType.FromString(value); + else if (j.ObjectProperty("Entry"u8, out var entryReader)) + entry = ReadAtchEntry(entryReader, ref j); + else + j.Skip(); + } + + var ret = new AtchIdentifier(type, Names.CombinedRace(gender, race), index); + return ret.Validate() ? ret : null; + } + + public static ShpIdentifier? ReadShp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out ShpEntry? entry) + { + entry = null; + ShapeAttributeString shape = default; + var slot = HumanSlot.Unknown; + PrimaryId? id = null; + var connectorCondition = ShapeConnectorCondition.None; + var genderRaceCondition = GenderRace.Unknown; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.StringProperty("Shape"u8, out StringU8 shp)) + { + if (ShapeAttributeString.TryRead(shp, out shape)) + continue; + + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Slot"u8, out HumanSlot s)) + slot = s; + else if (j.EnumProperty("ConnectorCondition"u8, out ShapeConnectorCondition cc)) + connectorCondition = cc; + else if (j.NumberProperty("GenderRaceCondition"u8, out ushort gr)) + genderRaceCondition = (GenderRace)gr; + else if (j.NumberProperty("Id"u8, out ushort i)) + id = i; + else if (j.BoolProperty("Entry"u8, out var e)) + entry = new ShpEntry(e); + else + j.Skip(); + } + + if (shape.Length is 0) + return null; + + var ret = new ShpIdentifier(slot, id, shape, connectorCondition, genderRaceCondition); + return ret.Validate() ? ret : null; + } + + public static AtrIdentifier? ReadAtr(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out AtrEntry? entry) + { + entry = null; + ShapeAttributeString attribute = default; + var slot = HumanSlot.Unknown; + PrimaryId? id = null; + var genderRaceCondition = GenderRace.Unknown; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.StringProperty("Attribute"u8, out StringU8 atr)) + { + if (ShapeAttributeString.TryRead(atr, out attribute)) + continue; + + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Slot"u8, out HumanSlot s)) + slot = s; + else if (j.NumberProperty("GenderRaceCondition"u8, out ushort gr)) + genderRaceCondition = (GenderRace) gr; + else if (j.NumberProperty("Id"u8, out ushort i)) + id = i; + else if (j.BoolProperty("Entry"u8, out var e)) + entry = new AtrEntry(e); + else + j.Skip(); + } + + if (attribute.Length is 0) + return null; + + var ret = new AtrIdentifier(slot, id, attribute, genderRaceCondition); + return ret.Validate() ? ret : null; + } + + public static ImcEntry? ReadImcEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j) + { + byte materialId = 0; + byte decalId = 0; + byte vfxId = 0; + byte materialAnimationId = 0; + byte soundId = 0; + ushort attributeMask = 0; + + while (entryReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.NumberProperty("MaterialId"u8, out byte mi)) + materialId = mi; + else if (j.NumberProperty("DecalId"u8, out byte di)) + decalId = di; + else if (j.NumberProperty("VfxId"u8, out byte vi)) + vfxId = vi; + else if (j.NumberProperty("MaterialAnimationId"u8, out byte mai)) + materialAnimationId = mai; + else if (j.NumberProperty("AttributeMask"u8, out ushort am)) + attributeMask = am; + else if (j.NumberProperty("SoundId"u8, out byte si)) + soundId = si; + else + j.Skip(); + } + + return new ImcEntry(materialId, decalId, attributeMask, soundId, vfxId, materialAnimationId); + } + + public static ImcIdentifier? ReadImc(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out ImcEntry? entry) + { + entry = null; + var objectType = ObjectType.Unknown; + var primaryId = PrimaryId.Zero; + var variant = Variant.Zero; + var secondaryId = SecondaryId.Zero; + var equipSlot = EquipSlot.Unknown; + ushort variantParse = 0; + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("ObjectType"u8, out ObjectType t)) + objectType = t; + else if (j.EnumProperty("EquipSlot"u8, out EquipSlot s)) + equipSlot = s; + else if (j.NumberProperty("PrimaryId"u8, out ushort i1)) + primaryId = new PrimaryId(i1); + else if (j.NumberProperty("Variant"u8, out variantParse)) + variant = new Variant((byte)variantParse); + else if (j.NumberProperty("SecondaryId"u8, out ushort i2)) + secondaryId = new SecondaryId(i2); + else if (j.ObjectProperty("Entry"u8, out var entryReader)) + entry = ReadImcEntry(entryReader, ref j); + else + j.Skip(); + } + + if (variantParse > byte.MaxValue) + return null; + + var ret = new ImcIdentifier(primaryId, variant, objectType, secondaryId, equipSlot, + objectType is ObjectType.Monster or ObjectType.Weapon ? BodySlot.Body : BodySlot.Unknown); + return ret.Validate() ? ret : null; + } + + public static GlobalEqpManipulation? ReadGeqp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j) + { + var type = (GlobalEqpType)100; + var condition = PrimaryId.Zero; + + while (objectReader.Read(ref j)) + { + if (j.TokenType is not JsonTokenType.PropertyName) + { + j.SkipCurrentObject(); + return null; + } + + if (j.EnumProperty("Type"u8, out GlobalEqpType t)) + type = t; + else if (j.NumberProperty("Condition"u8, out ushort i)) + condition = new PrimaryId(i); + else + j.Skip(); + } + + var ret = new GlobalEqpManipulation + { + Type = type, + Condition = condition, + }; + return ret.Validate() ? ret : null; + } + + private static void AddSingleManipulation(IModDataContainer? container, Utf8JsonObjectLimit objectReader, ref Utf8JsonReader reader, + MetaDictionary ret, + MetaManipulationType type) + { + while (objectReader.Read(ref reader)) + { + if (reader.TokenType is not JsonTokenType.PropertyName) + throw new JsonException("Property name expected."); + + if (reader.ObjectProperty("Manipulation"u8, out var manipulationReader)) + switch (type) + { + case MetaManipulationType.Imc + when CheckIdentifier(container, "IMC", ReadImc(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Eqdp + when CheckIdentifier(container, "EQDP", ReadEqdp(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Eqp + when CheckIdentifier(container, "EQP", ReadEqp(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Est + when CheckIdentifier(container, "EST", ReadEst(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Gmp + when CheckIdentifier(container, "GMP", ReadGmp(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Rsp + when CheckIdentifier(container, "RSP", ReadRsp(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Atch + when CheckIdentifier(container, "ATCH", ReadAtch(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Shp + when CheckIdentifier(container, "SHP", ReadShp(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.Atr + when CheckIdentifier(container, "ATR", ReadAtr(manipulationReader, ref reader, out var e), e, out var identifier, + out var entry): + ret.TryAdd(identifier, entry); + break; + case MetaManipulationType.GlobalEqp + when CheckIdentifier(container, "Global EQP", ReadGeqp(manipulationReader, ref reader), (int?)0, out var identifier, + out _): + ret.TryAdd(identifier); + break; + } + else + // Skip other properties. + reader.Skip(); + } + } + + private static bool CheckIdentifier(IModDataContainer? container, string? type, TIdentifier? i, TEntry? e, + out TIdentifier identifier, out TEntry entry) + where TIdentifier : struct where TEntry : struct + { + if (i.HasValue) + if (e.HasValue) + { + identifier = i.Value; + entry = e.Value; + return true; + } + + if (container is not null) + Penumbra.Log.Warning($"Invalid {type} Manipulation encountered in {container.Mod.Name} - {container.GetFullName()}."); + else + Penumbra.Log.Warning($"Invalid {type} Manipulation encountered."); + identifier = default; + entry = default; + return false; + } +} diff --git a/Penumbra/Files/MetaSerialization.cs b/Penumbra/Files/MetaSerialization.cs new file mode 100644 index 000000000..37d9d1083 --- /dev/null +++ b/Penumbra/Files/MetaSerialization.cs @@ -0,0 +1,166 @@ +using System.Buffers; +using System.Text.Json; +using Luna; +using Penumbra.GameData.Files.AtchStructs; +using Penumbra.GameData.Structs; +using Penumbra.Meta.Manipulations; + +namespace Penumbra.Files; + +public static class MetaSerialization +{ + /// Write all meta entries in a meta dictionary as a new JSON array. + public static Utf8JsonWriter WriteMetaDictionary(Utf8JsonWriter j, MetaDictionary meta) + { + j.WriteStartArray(); + if (meta.Count > 0) + { + SerializeTo(j, meta.Imc); + SerializeTo(j, meta.Eqp); + SerializeTo(j, meta.Eqdp); + SerializeTo(j, meta.Est); + SerializeTo(j, meta.Rsp); + SerializeTo(j, meta.Gmp); + SerializeTo(j, meta.Atch); + SerializeTo(j, meta.Shp); + SerializeTo(j, meta.Atr); + SerializeTo(j, meta.GlobalEqp); + } + + j.WriteEndArray(); + return j; + } + + public static ReadOnlyMemory Serialize(IEnumerable> manipulations) + where TIdentifier : unmanaged, IMetaIdentifier + where TEntry : unmanaged + { + var data = new ArrayBufferWriter(); + using var writer = new Utf8JsonWriter(data, JsonFunctions.WriterOptions); + writer.WriteStartArray(); + SerializeTo(writer, manipulations); + writer.WriteEndArray(); + return data.WrittenMemory; + } + + public static ReadOnlyMemory Serialize(IEnumerable manipulations) + { + var data = new ArrayBufferWriter(); + using var writer = new Utf8JsonWriter(data, JsonFunctions.WriterOptions); + writer.WriteStartArray(); + SerializeTo(writer, manipulations); + writer.WriteEndArray(); + return data.WrittenMemory; + } + + /// Add all given entries to a pre-existing JSON array. + public static Utf8JsonWriter SerializeTo(Utf8JsonWriter j, + IEnumerable> manipulations) + where TIdentifier : unmanaged, IMetaIdentifier + where TEntry : unmanaged + { + foreach (var (identifier, entry) in manipulations) + Serialize(j, identifier, entry); + return j; + } + + /// Add all given entries to a pre-existing JSON array. + public static Utf8JsonWriter SerializeTo(Utf8JsonWriter j, IEnumerable manipulations) + { + foreach (var manip in manipulations) + Serialize(j, manip); + return j; + } + + /// Serialize a single identifier and entry pair. + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, TIdentifier identifier, TEntry entry) + where TIdentifier : unmanaged, IMetaIdentifier + where TEntry : unmanaged + { + if (typeof(TIdentifier) == typeof(EqpIdentifier) && typeof(TEntry) == typeof(EqpEntryInternal)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(EqpIdentifier) && typeof(TEntry) == typeof(EqpEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(EqdpIdentifier) && typeof(TEntry) == typeof(EqdpEntryInternal)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(EqdpIdentifier) && typeof(TEntry) == typeof(EqdpEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(EstIdentifier) && typeof(TEntry) == typeof(EstEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(GmpIdentifier) && typeof(TEntry) == typeof(GmpEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(RspIdentifier) && typeof(TEntry) == typeof(RspEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(ImcIdentifier) && typeof(TEntry) == typeof(ImcEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(AtchIdentifier) && typeof(TEntry) == typeof(AtchEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(ShpIdentifier) && typeof(TEntry) == typeof(ShpEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(AtrIdentifier) && typeof(TEntry) == typeof(AtrEntry)) + Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry)); + else if (typeof(TIdentifier) == typeof(GlobalEqpManipulation)) + Serialize(j, Unsafe.As(ref identifier)); + return j; + } + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqpIdentifier identifier, EqpEntryInternal entry) + => Serialize(j, identifier, entry.ToEntry(identifier.Slot)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqpIdentifier identifier, EqpEntry entry) + => Serialize(j, "Eqp"u8, identifier, entry, static (w, e) => w.WriteNumberValue((ulong)e)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqdpIdentifier identifier, EqdpEntryInternal entry) + => Serialize(j, identifier, entry.ToEntry(identifier.Slot)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqdpIdentifier identifier, EqdpEntry entry) + => Serialize(j, "Eqdp"u8, identifier, entry, static (w, e) => w.WriteNumberValue((ushort)e)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EstIdentifier identifier, EstEntry entry) + => Serialize(j, "Est"u8, identifier, entry, static (w, e) => w.WriteNumberValue(e.Value)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, GmpIdentifier identifier, GmpEntry entry) + => Serialize(j, "Gmp"u8, identifier, entry, static (w, e) => e.WriteJson(w)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, ImcIdentifier identifier, ImcEntry entry) + => Serialize(j, "Imc"u8, identifier, entry, static (w, e) => e.WriteJson(w)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, RspIdentifier identifier, RspEntry entry) + => Serialize(j, "Rsp"u8, identifier, entry, static (w, e) => w.WriteNumberValue(e.Value)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, AtchIdentifier identifier, AtchEntry entry) + => Serialize(j, "Atch"u8, identifier, entry, static (w, e) => e.WriteJson(w)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, ShpIdentifier identifier, ShpEntry entry) + => Serialize(j, "Shp"u8, identifier, entry, static (w, e) => w.WriteBooleanValue(e.Value)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, AtrIdentifier identifier, AtrEntry entry) + => Serialize(j, "Atr"u8, identifier, entry, static (w, e) => w.WriteBooleanValue(e.Value)); + + public static Utf8JsonWriter Serialize(Utf8JsonWriter j, GlobalEqpManipulation identifier) + { + j.WriteStartObject(); + j.WriteString("Type"u8, "GlobalEqp"u8); + j.WriteStartObject("Manipulation"u8); + identifier.AddToJson(j); + j.WriteEndObject(); + j.WriteEndObject(); + return j; + } + + private static Utf8JsonWriter Serialize(Utf8JsonWriter j, ReadOnlySpan type, TIdentifier identifier, + TEntry entry, + Action writeEntry) + where TIdentifier : IMetaIdentifier + { + j.WriteStartObject(); + j.WriteString("Type"u8, type); + j.WriteStartObject("Manipulation"u8); + identifier.AddToJson(j); + j.WritePropertyName("Entry"u8); + writeEntry(j, entry); + j.WriteEndObject(); + j.WriteEndObject(); + return j; + } +} diff --git a/Penumbra/Files/ModDeserialization.cs b/Penumbra/Files/ModDeserialization.cs new file mode 100644 index 000000000..543340812 --- /dev/null +++ b/Penumbra/Files/ModDeserialization.cs @@ -0,0 +1,420 @@ +using System.Text.Json; +using Luna; +using Penumbra.GameData.Structs; +using Penumbra.Mods; +using Penumbra.Mods.Groups; +using Penumbra.Mods.Manager; +using Penumbra.Mods.Manager.OptionEditor; +using Penumbra.Mods.SubMods; + +namespace Penumbra.Files; + +public static class ModDeserialization +{ + public sealed class Context(Mod mod) : IDisposable + { + public readonly Mod Mod = mod; + public readonly Dictionary Parents = []; + public readonly Dictionary> Conditions = []; + + public void Dispose() + { + foreach (var (group, guid) in Parents) + { + if (!Mod.SubObjects.TryGetValue(guid, out var parentObject)) + throw new InvalidMetaException(Mod, string.Empty, $"The specified parent object {guid} for {group.Name} does not exist."); + + if (CycleChecker.Check(group, parentObject)) + throw new InvalidMetaException(Mod, string.Empty, + $"The specified parent object {parentObject.Name} for {group.Name} would cause a cycle."); + + group.ParentSetting = parentObject; + } + + foreach (var (@object, condition) in Conditions) + ResolveConditions(@object, condition); + + if (CheckCyclicConditions(Mod) is { } error) + throw new InvalidMetaException(Mod, string.Empty, error); + } + + private static string? ValidateCondition(IModObject parent, Guid condition, out IModOption? option) + { + if (!parent.Mod.SubObjects.TryGetValue(condition, out var @object) || @object is not IModOption o) + { + option = null; + return $"The specified option {condition} for {parent.Name}'s conditions does not exist or is not an option."; + } + + option = o; + return LayoutManager.ValidateCondition(parent, option); + } + + private static string? CheckCyclicConditions(Mod _) + { + // TODO + return null; + } + + private static ICondition Convert(IModObject parent, SettingIdCondition condition) + { + if (ValidateCondition(parent, condition.Option, out var option) is { } error) + throw new InvalidMetaException(parent.Mod, string.Empty, error); + return new SettingCondition(option!); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void ResolveConditions(IModObject @object, ICondition condition) + { + var reduced = condition.EditConditions(m => m is SettingIdCondition id ? Convert(@object, id) : null)?.Reduce(); + if (reduced is not null and not TrueCondition) + @object.Condition = reduced; + } + } + + + public static ModDataChangeType ReloadMod(SaveService files, Mod mod) + { + mod.ModPath.Refresh(); + if (!mod.ModPath.Exists) + throw new MetaMissingException(mod, mod.ModPath.FullName); + + var metaPath = files.FileNames.ModMetaPath(mod); + if (!File.Exists(metaPath)) + throw new MetaMissingException(mod, metaPath); + + using var context = new Context(mod); + var meta = IJsonParsable.ReadJson(files, metaPath, false, context).Changes; + MigrateGroups(files, context); + + return meta; + } + + private static void MigrateGroups(SaveService files, Context context) + { + if (context.Mod.LoadedVersion >= 4) + return; + + GroupDeserialization.ReadDefaultContainerFile(files, context); + foreach (var groupFile in files.FileNames.GetOptionGroupFiles(context.Mod)) + { + if (GroupDeserialization.ReadGroupFile(files, context, groupFile) is { } group) + context.Mod.AddGroup(group, groupFile.FullName); + } + } + + public ref struct ModMetaData : IJsonParsable + { + public ModDataChangeType Changes; + + public static ModMetaData Read(scoped ref Utf8JsonReader reader, string filePath, object? userInput) + { + if (userInput is not Context context) + throw new ArgumentException("The user input for reading a Mod has to be the mod object."); + + if (!reader.Read() || reader.TokenType is not JsonTokenType.StartObject) + throw new InvalidMetaException(context.Mod, filePath, "File is empty or malformed."); + + ModDataChangeType visited = 0; + ModDataChangeType ret = 0; + var encounteredDefault = false; + var objectReader = reader.CreateObjectLimit(); + + context.Mod.Groups.Clear(); + context.Mod.SubObjects.Clear(); + while (objectReader.Read(ref reader)) + { + if (reader.TokenType is not JsonTokenType.PropertyName) + throw new InvalidMetaException(context.Mod, filePath, $"Expected property name but got {reader.TokenType}."); + + if (reader.NumberProperty("FileVersion"u8, out uint fileVersion)) + { + if (context.Mod.LoadedVersion != fileVersion) + { + ret |= ModDataChangeType.Migration; + context.Mod.LoadedVersion = fileVersion; + } + + visited |= ModDataChangeType.Migration; + continue; + } + + if (reader.GuidProperty("Identifier"u8, out var identifier)) + { + if (context.Mod.StableIdentifier != identifier) + { + ret |= ModDataChangeType.Identifier; + context.Mod.StableIdentifier = identifier; + } + + visited |= ModDataChangeType.Identifier; + continue; + } + + if (reader.StringProperty("Name"u8, out string? name, true)) + { + if (string.IsNullOrEmpty(name)) + throw new InvalidMetaException(context.Mod, filePath, "Mod with empty name is not allowed."); + + if (context.Mod.Name != name) + { + ret |= ModDataChangeType.Name; + context.Mod.Name = name; + } + + visited |= ModDataChangeType.Name; + continue; + } + + if (reader.StringProperty("Author"u8, out string? author, true)) + { + author ??= string.Empty; + if (context.Mod.Author != author) + { + ret |= ModDataChangeType.Author; + context.Mod.Author = author; + } + + visited |= ModDataChangeType.Author; + continue; + } + + if (reader.StringProperty("Description"u8, out string? description, true)) + { + description ??= string.Empty; + if (context.Mod.Description != description) + { + ret |= ModDataChangeType.Description; + context.Mod.Description = description; + } + + visited |= ModDataChangeType.Description; + continue; + } + + if (reader.StringProperty("Image"u8, out string? image, true)) + { + image ??= string.Empty; + if (context.Mod.Image != image) + { + ret |= ModDataChangeType.Image; + context.Mod.Image = image; + } + + visited |= ModDataChangeType.Image; + continue; + } + + if (reader.StringProperty("Version"u8, out string? version, true)) + { + version ??= string.Empty; + if (context.Mod.Version != version) + { + ret |= ModDataChangeType.Version; + context.Mod.Version = version; + } + + visited |= ModDataChangeType.Version; + continue; + } + + if (reader.StringProperty("Website"u8, out string? website, true)) + { + website ??= string.Empty; + if (context.Mod.Website != website) + { + ret |= ModDataChangeType.Website; + context.Mod.Website = website; + } + + visited |= ModDataChangeType.Website; + continue; + } + + if (reader.ArrayProperty("ModTags"u8, out _, true)) + { + var tags = reader.ReadStringArray() ?? []; + ret |= ModDataEditor.UpdateTags(context.Mod, tags!, null); + visited |= ModDataChangeType.ModTags; + continue; + } + + if (reader.ArrayProperty("DefaultPreferredItems"u8, out _, true)) + { + var items = reader.ReadNumberArray(); + if (items is null) + { + if (context.Mod.DefaultPreferredItems.Count > 0) + { + ret |= ModDataChangeType.DefaultChangedItems; + context.Mod.DefaultPreferredItems.Clear(); + } + } + else if (!context.Mod.DefaultPreferredItems.SetEquals(items.Select(i => new CustomItemId(i)))) + { + ret |= ModDataChangeType.DefaultChangedItems; + context.Mod.DefaultPreferredItems.Clear(); + context.Mod.DefaultPreferredItems.UnionWith(items.Select(i => new CustomItemId(i))); + } + + visited |= ModDataChangeType.DefaultChangedItems; + continue; + } + + if (reader.ArrayProperty("RequiredFeatures"u8, out _, true)) + { + var features = reader.ReadFlagEnumArray() ?? FeatureFlags.None; + if (context.Mod.RequiredFeatures != features) + { + ret |= ModDataChangeType.RequiredFeatures; + context.Mod.RequiredFeatures = features; + } + + visited |= ModDataChangeType.RequiredFeatures; + continue; + } + + if (reader.ObjectProperty("DefaultData"u8, out _, true)) + { + GroupDeserialization.ReadDefaultContainer(context, ref reader, filePath); + encounteredDefault = true; + continue; + } + + if (reader.ObjectProperty("PageNames"u8, out var pageNameReader, true)) + { + context.Mod.PageNames.Clear(); + while (pageNameReader.Read(ref reader)) + { + if (reader.TokenType is not JsonTokenType.PropertyName || !reader.TryReadNumber(out var pageNumber)) + throw new InvalidMetaException(context.Mod, filePath, "PageNames dictionary expected number as property name."); + + if (!pageNameReader.Read(ref reader) || !reader.TryReadString(out var pageName, "", true)) + throw new InvalidMetaException(context.Mod, filePath, + "PageNames dictionary expected string or null as property value."); + + context.Mod.PageNames.TryAdd(pageNumber, pageName ?? $"Page {pageNumber + 1}"); + } + + visited |= ModDataChangeType.PageNames; + continue; + } + + if (ReadGroups(ref reader, filePath, context)) + continue; + + reader.Skip(); + } + + ret |= SetDefaults(context.Mod, filePath, visited); + + if (context.Mod.LoadedVersion >= 4 && !encounteredDefault) + { + context.Mod.Default.Files.Clear(); + context.Mod.Default.FileSwaps.Clear(); + context.Mod.Default.Manipulations.Clear(); + } + + return new ModMetaData { Changes = ret }; + } + + private static bool ReadGroups(ref Utf8JsonReader reader, string filePath, Context context) + { + if (!reader.ArrayProperty("Groups"u8, out var arrayReader, true)) + return false; + + while (arrayReader.Read(ref reader)) + { + if (GroupDeserialization.ReadGroup(context, ref reader, filePath) is { } group) + context.Mod.AddGroup(group, filePath); + } + + return true; + } + + private static ModDataChangeType SetDefaults(Mod mod, string filePath, ModDataChangeType visited) + { + if (!visited.HasFlag(ModDataChangeType.Migration) || mod.LoadedVersion < 1) + throw new InvalidMetaException(mod, filePath, "No file version provided."); + + if (!visited.HasFlag(ModDataChangeType.Name) || mod.Name.Length is 0) + throw new InvalidMetaException(mod, filePath, "Either no or empty mod name provided."); + + ModDataChangeType ret = 0; + if (!visited.HasFlag(ModDataChangeType.Identifier)) + { + mod.StableIdentifier = Guid.NewGuid(); + ret |= ModDataChangeType.Identifier; + } + + if (!visited.HasFlag(ModDataChangeType.Author) && mod.Author.Length > 0) + { + mod.Author = string.Empty; + ret |= ModDataChangeType.Author; + } + + if (!visited.HasFlag(ModDataChangeType.Description) && mod.Description.Length > 0) + { + mod.Description = string.Empty; + ret |= ModDataChangeType.Description; + } + + if (!visited.HasFlag(ModDataChangeType.Image) && mod.Image.Length > 0) + { + mod.Image = string.Empty; + ret |= ModDataChangeType.Image; + } + + if (!visited.HasFlag(ModDataChangeType.Version) && mod.Version.Length > 0) + { + mod.Version = string.Empty; + ret |= ModDataChangeType.Version; + } + + if (!visited.HasFlag(ModDataChangeType.Website) && mod.Website.Length > 0) + { + mod.Website = string.Empty; + ret |= ModDataChangeType.Website; + } + + if (!visited.HasFlag(ModDataChangeType.PreferredChangedItems) && mod.DefaultPreferredItems.Count > 0) + { + mod.DefaultPreferredItems.Clear(); + ret |= ModDataChangeType.DefaultChangedItems; + } + + if (!visited.HasFlag(ModDataChangeType.RequiredFeatures) && mod.RequiredFeatures is not FeatureFlags.None) + { + mod.RequiredFeatures = FeatureFlags.None; + ret |= ModDataChangeType.RequiredFeatures; + } + + if (!visited.HasFlag(ModDataChangeType.ModTags) && mod.ModTags.Count > 0) + { + mod.ModTags = []; + ret |= ModDataChangeType.ModTags; + } + + if (!visited.HasFlag(ModDataChangeType.PageNames) && mod.PageNames.Count > 0) + { + mod.PageNames = []; + ret |= ModDataChangeType.PageNames; + } + + return ret; + } + } +} + +public sealed class MetaMissingException(Mod mod, string metaPath) : FileNotFoundException +{ + public readonly Mod Mod = mod; + public readonly string MetaPath = metaPath; +} + +public sealed class InvalidMetaException(Mod mod, string filePath, string reason) : JsonException +{ + public readonly Mod Mod = mod; + public readonly string FilePath = filePath; + public readonly string Reason = reason; +} diff --git a/Penumbra/Files/ModSerialization.cs b/Penumbra/Files/ModSerialization.cs new file mode 100644 index 000000000..daa717c3a --- /dev/null +++ b/Penumbra/Files/ModSerialization.cs @@ -0,0 +1,67 @@ +using System.Text.Json; +using ImSharp; +using Luna; +using Penumbra.Mods; + +namespace Penumbra.Files; + +public static class ModSerialization +{ + public const uint CurrentFileVersion = 4; + + public static void WriteMod(Utf8JsonWriter j, Mod mod) + { + j.WriteStartObject(); + + j.WriteNumber("FileVersion"u8, CurrentFileVersion); + j.WriteString("Identifier"u8, mod.StableIdentifier); + j.WriteString("LastWrite"u8, DateTime.UtcNow); + j.WriteString("Name"u8, mod.Name); + j.WriteNonEmptyString("Author"u8, mod.Author); + j.WriteNonEmptyString("Description"u8, mod.Description); + j.WriteNonEmptyString("Image"u8, mod.Image); + j.WriteNonEmptyString("Version"u8, mod.Version); + j.WriteNonEmptyString("Website"u8, mod.Website); + + if (mod.ModTags.Count > 0) + { + j.WriteStartArray("ModTags"u8); + foreach (var tag in mod.ModTags) + j.WriteStringValue(tag); + j.WriteEndArray(); + } + + if (mod.DefaultPreferredItems.Count > 0) + { + j.WriteStartArray("DefaultPreferredItems"u8); + foreach (var item in mod.DefaultPreferredItems) + j.WriteNumberValue(item); + j.WriteEndArray(); + } + + if (mod.RequiredFeatures is not FeatureFlags.None) + { + var features = mod.RequiredFeatures; + j.WriteStartArray("RequiredFeatures"u8); + foreach (var flag in FeatureFlags.Values) + { + if ((features & flag) is not FeatureFlags.None) + j.WriteStringValue(flag.ToNameU8()); + } + + j.WriteEndArray(); + } + + GroupSerialization.WriteDefaultContainer(j, mod, mod.ModPath); + + if (mod.Groups.Count > 0) + { + j.WriteStartArray("Groups"u8); + foreach (var group in mod.Groups) + GroupSerialization.WriteGroup(j, group, mod.ModPath); + j.WriteEndArray(); + } + + j.WriteEndObject(); + } +} diff --git a/Penumbra/Import/TexToolsImport.cs b/Penumbra/Import/TexToolsImport.cs index 7981b4472..13e08d7e3 100644 --- a/Penumbra/Import/TexToolsImport.cs +++ b/Penumbra/Import/TexToolsImport.cs @@ -4,6 +4,8 @@ using Penumbra.Mods.Editor; using Penumbra.Mods.Manager; using Penumbra.Services; +using SharpCompress.Archives; +using SharpCompress.Writers.Zip; using FileMode = System.IO.FileMode; using ZipArchive = SharpCompress.Archives.Zip.ZipArchive; using ZipArchiveEntry = SharpCompress.Archives.Zip.ZipArchiveEntry; @@ -26,8 +28,8 @@ public partial class TexToolsImporter : IDisposable private readonly CancellationTokenSource _cancellation = new(); private readonly CancellationToken _token; - public ImporterState State { get; private set; } - public readonly List<(FileInfo File, DirectoryInfo? Mod, Exception? Error)> ExtractedMods; + public ImporterState State { get; private set; } + public readonly List ExtractedMods; private readonly Configuration _config; private readonly DuplicateManager _duplicates; @@ -37,8 +39,9 @@ public partial class TexToolsImporter : IDisposable private readonly MigrationManager _migrationManager; public TexToolsImporter(int count, IEnumerable modPackFiles, Action handler, - Configuration config, DuplicateManager duplicates, ModNormalizer modNormalizer, ModManager modManager, FileCompactor compactor, - MigrationManager migrationManager, TexToolsImporter? previous) + TaskCompletionSource taskCompletionSource, Configuration config, DuplicateManager duplicates, + ModNormalizer modNormalizer, ModManager modManager, FileCompactor compactor, MigrationManager migrationManager, + TexToolsImporter? previous) { if (previous is not null) { @@ -58,7 +61,7 @@ public TexToolsImporter(int count, IEnumerable modPackFiles, Action(count + _previousModPackCount); + ExtractedMods = new List(count + _previousModPackCount); _token = _cancellation.Token; if (previous is not null) ExtractedMods.AddRange(previous.ExtractedMods); @@ -68,7 +71,9 @@ public TexToolsImporter(int count, IEnumerable modPackFiles, Action { taskCompletionSource.SetResult(ExtractedMods.Skip(_previousModPackCount).ToArray()); }, + TaskScheduler.Default); } private void CloseStreams() @@ -100,14 +105,14 @@ private void ImportFiles() _currentModDirectory = null; if (_token.IsCancellationRequested) { - ExtractedMods.Add((file, null, new TaskCanceledException("Task canceled by user."))); + ExtractedMods.Add(new ModImportResult(file, null, new TaskCanceledException("Task canceled by user."))); continue; } try { var directory = VerifyVersionAndImport(file); - ExtractedMods.Add((file, directory, null)); + ExtractedMods.Add(new ModImportResult(file, directory, null)); if (_config.AutoDeduplicateOnImport) { State = ImporterState.DeduplicatingFiles; @@ -116,7 +121,7 @@ private void ImportFiles() } catch (Exception e) { - ExtractedMods.Add((file, _currentModDirectory, e)); + ExtractedMods.Add(new ModImportResult(file, _currentModDirectory, e)); _currentNumOptions = 0; _currentOptionIdx = 0; _currentFileIdx = 0; @@ -137,7 +142,7 @@ private DirectoryInfo VerifyVersionAndImport(FileInfo modPackFile) return HandleRegularArchive(modPackFile); using var zfs = modPackFile.OpenRead(); - using var extractedModPack = ZipArchive.Open(zfs); + using var extractedModPack = ZipArchive.OpenArchive(zfs); var mpl = FindZipEntry(extractedModPack, "TTMPL.mpl"); if (mpl == null) @@ -161,10 +166,10 @@ private DirectoryInfo VerifyVersionAndImport(FileInfo modPackFile) } // You can in no way rely on any file paths in TTMPs so we need to just do this, sorry - private static ZipArchiveEntry? FindZipEntry(ZipArchive file, string fileName) + private static IArchiveEntry? FindZipEntry(IWritableArchive file, string fileName) => file.Entries.FirstOrDefault(e => e is { IsDirectory: false, Key: not null } && e.Key.Contains(fileName)); - private static string GetStringFromZipEntry(ZipArchiveEntry entry, Encoding encoding) + private static string GetStringFromZipEntry(IArchiveEntry entry, Encoding encoding) { using var ms = new MemoryStream(); using var s = entry.OpenEntryStream(); @@ -184,7 +189,7 @@ private void WriteZipEntryToTempFile(Stream s) _tmpFileStream = null; } - private StreamDisposer GetSqPackStreamStream(ZipArchive file, string entryName) + private StreamDisposer GetSqPackStreamStream(IWritableArchive file, string entryName) { State = ImporterState.WritingPackToDisk; diff --git a/Penumbra/Import/TexToolsImporter.Archives.cs b/Penumbra/Import/TexToolsImporter.Archives.cs index c53408056..34760cc3f 100644 --- a/Penumbra/Import/TexToolsImporter.Archives.cs +++ b/Penumbra/Import/TexToolsImporter.Archives.cs @@ -8,19 +8,12 @@ using SharpCompress.Archives; using SharpCompress.Archives.Rar; using SharpCompress.Archives.SevenZip; -using SharpCompress.Common; using ZipArchive = SharpCompress.Archives.Zip.ZipArchive; namespace Penumbra.Import; public partial class TexToolsImporter { - private static readonly ExtractionOptions ExtractionOptions = new() - { - ExtractFullPath = true, - Overwrite = true, - }; - /// /// Extract regular compressed archives that are folders containing penumbra-formatted mods. /// The mod has to either contain a meta.json at top level, or one folder deep. @@ -31,7 +24,7 @@ public partial class TexToolsImporter private DirectoryInfo HandleRegularArchive(FileInfo modPackFile) { using var zfs = modPackFile.OpenRead(); - using var archive = ArchiveFactory.Open(zfs); + using var archive = ArchiveFactory.OpenArchive(zfs); var baseName = FindArchiveModMeta(archive, out var leadDir); var name = string.Empty; @@ -40,34 +33,35 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile) _currentModName = modPackFile.Name; _currentGroupName = string.Empty; _currentOptionName = DefaultTexToolsData.Name; - _currentNumFiles = - archive switch - { - RarArchive r => r.Entries.Count, - ZipArchive z => z.Entries.Count, - SevenZipArchive s => s.Entries.Count, - _ => archive.Entries.Count(), - }; + _currentNumFiles = archive switch + { + RarArchive r => r.Entries.Count, + ZipArchive z => z.Entries.Count, + SevenZipArchive s => s.Entries.Count, + _ => archive.Entries.Count(), + }; Penumbra.Log.Information($" -> Importing {archive.Type} Archive."); _currentModDirectory = ModCreator.CreateModFolder(_baseDirectory, Path.GetRandomFileName(), _config.ReplaceNonAsciiOnImport, true); - State = ImporterState.ExtractingModFiles; _currentFileIdx = 0; ArchiveUtility.ForEachEntry(archive, reader => { _token.ThrowIfCancellationRequested(); - if (reader.Entry.IsDirectory) + if (reader.Entry.IsDirectory || string.IsNullOrEmpty(reader.Entry.Key)) { --_currentNumFiles; return; } + if (!string.IsNullOrEmpty(reader.Entry.LinkTarget)) + throw new ArchiveUtility.SymbolicLinkException(reader.Entry.Key, reader.Entry.LinkTarget); + Penumbra.Log.Information($" -> Extracting {reader.Entry.Key}"); // Check that the mod has a valid name in the meta.json file. - if (Path.GetFileName(reader.Entry.Key) == "meta.json") + if (Path.GetFileName(reader.Entry.Key.AsSpan()).Equals("meta.json", StringComparison.OrdinalIgnoreCase)) { using var s = new MemoryStream(); using var e = reader.OpenEntryStream(); @@ -80,7 +74,7 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile) if (name.Length is 0) throw new Exception("Invalid mod archive: mod meta has no name."); - using var f = File.OpenWrite(Path.Combine(_currentModDirectory.FullName, reader.Entry.Key!)); + using var f = File.OpenWrite(Path.CombineSafely(_currentModDirectory.FullName, reader.Entry.Key!)); s.Seek(0, SeekOrigin.Begin); s.WriteTo(f); } @@ -105,7 +99,7 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile) if (leadDir) { _currentModDirectory = ModCreator.CreateModFolder(_baseDirectory, baseName, _config.ReplaceNonAsciiOnImport, false); - Directory.Move(Path.Combine(oldName, baseName), _currentModDirectory.FullName); + Directory.Move(Path.CombineSafely(oldName, baseName), _currentModDirectory.FullName); Directory.Delete(oldName); } else @@ -138,18 +132,10 @@ private void HandleFileMigrationsAndWrite(ArchiveUtility.ReaderShim reader) { switch (Path.GetExtension(reader.Entry.Key)) { - case ".mdl": - _migrationManager.MigrateMdlDuringExtraction(reader, _currentModDirectory!.FullName); - break; - case ".mtrl": - _migrationManager.MigrateMtrlDuringExtraction(reader, _currentModDirectory!.FullName); - break; - case ".tex": - _migrationManager.FixMipMaps(reader, _currentModDirectory!.FullName); - break; - default: - reader.WriteEntryToDirectory(_currentModDirectory!.FullName); - break; + case ".mdl": _migrationManager.MigrateMdlDuringExtraction(reader, _currentModDirectory!.FullName); break; + case ".mtrl": _migrationManager.MigrateMtrlDuringExtraction(reader, _currentModDirectory!.FullName); break; + case ".tex": _migrationManager.FixMipMaps(reader, _currentModDirectory!.FullName); break; + default: reader.WriteEntryToDirectory(_currentModDirectory!.FullName); break; } } diff --git a/Penumbra/Import/TexToolsImporter.ModPack.cs b/Penumbra/Import/TexToolsImporter.ModPack.cs index 30d23efe3..aa670e266 100644 --- a/Penumbra/Import/TexToolsImporter.ModPack.cs +++ b/Penumbra/Import/TexToolsImporter.ModPack.cs @@ -7,7 +7,8 @@ using Penumbra.Mods.Settings; using Penumbra.Mods.SubMods; using Penumbra.Util; -using ZipArchive = SharpCompress.Archives.Zip.ZipArchive; +using SharpCompress.Archives; +using SharpCompress.Writers.Zip; namespace Penumbra.Import; @@ -16,7 +17,7 @@ public partial class TexToolsImporter private DirectoryInfo? _currentModDirectory; // Version 1 mod packs are a simple collection of files without much information. - private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, ZipArchive extractedModPack, string modRaw) + private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, IWritableArchive extractedModPack, string modRaw) { _currentOptionIdx = 0; _currentNumOptions = 1; @@ -53,7 +54,7 @@ private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, ZipArchive extracted } // Version 2 mod packs can either be simple or extended, import accordingly. - private DirectoryInfo ImportV2ModPack(FileInfo _, ZipArchive extractedModPack, string modRaw) + private DirectoryInfo ImportV2ModPack(FileInfo _, IWritableArchive extractedModPack, string modRaw) { var modList = JsonConvert.DeserializeObject(modRaw, JsonSettings)!; @@ -83,7 +84,7 @@ private DirectoryInfo ImportV2ModPack(FileInfo _, ZipArchive extractedModPack, s } // Simple V2 mod packs are basically the same as V1 mod packs. - private DirectoryInfo ImportSimpleV2ModPack(ZipArchive extractedModPack, SimpleModPack modList) + private DirectoryInfo ImportSimpleV2ModPack(IWritableArchive extractedModPack, SimpleModPack modList) { _currentOptionIdx = 0; _currentNumOptions = 1; @@ -126,7 +127,7 @@ private static string GetGroupName(string groupName, ISet names) } // Extended V2 mod packs contain multiple options that need to be handled separately. - private DirectoryInfo ImportExtendedV2ModPack(ZipArchive extractedModPack, string modRaw) + private DirectoryInfo ImportExtendedV2ModPack(IWritableArchive extractedModPack, string modRaw) { _currentOptionIdx = 0; Penumbra.Log.Information(" -> Importing Extended V2 ModPack"); @@ -251,7 +252,7 @@ private void ExtractMod(DirectoryInfo outDirectory, SimpleMod mod) var data = stream.ReadFile(mod.ModOffset); _currentFileName = mod.FullPath; - var extractedFile = new FileInfo(Path.Combine(outDirectory.FullName, mod.FullPath)); + var extractedFile = new FileInfo(Path.CombineSafely(outDirectory.FullName, mod.FullPath)); extractedFile.Directory?.Create(); diff --git a/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs b/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs new file mode 100644 index 000000000..95e4789c5 --- /dev/null +++ b/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs @@ -0,0 +1,28 @@ +using Luna.Generators; + +namespace Penumbra.Import.Textures; + +/// Presented to the user as "Hardware Acceleration Mode for Texture Compression". +[NamedEnum(Utf16: false)] +[TooltipEnum] +public enum AuxiliaryDeviceMode +{ + [Name("Ephemeral")] + [Tooltip("Create an ephemeral Direct3D device object per texture compression operation.")] + Transient, + + [Name("Persistent")] + [Tooltip( + "Create a persistent Direct3D device object on the first texture compression operation and keep it until Penumbra is unloaded or when this setting is changed.")] + Singleton, + + [Name("Use Main Game Device")] + [Tooltip( + "Do not create an auxiliary Direct3D device object, and use the game's main one instead.\nWill cause freezes while doing texture compression operations.\nPrefer the above options if possible.")] + Borrowed, + + [Name("Disable Hardware Acceleration")] + [Tooltip( + "Do not create an auxiliary Direct3D device object, and use a software compression method instead.\nWill significantly slow down texture compression operations, and significantly degrade the output quality.\nONLY USE AS A LAST RESORT.")] + None, +} diff --git a/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs b/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs new file mode 100644 index 000000000..bde3a7252 --- /dev/null +++ b/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs @@ -0,0 +1,70 @@ +using Dalamud.Plugin.Services; +using Luna.DirectX; +using OtterTex; + +namespace Penumbra.Import.Textures; + +/// An image processing effect that saves its input to a file. +/// Dalamud's texture readback provider. +/// The texture manager service. +/// Whether to save as TEX. +/// The path to save at. +/// Which texture compression type to use. +/// Whether to add mipmaps to the saved texture. +public class SaveToDdsTexFileEffect( + ITextureReadbackProvider readbackProvider, + TextureManager textureManager, + bool asTex, + string path, + CombinedTexture.TextureSaveType textureSaveType = CombinedTexture.TextureSaveType.AsIs, + bool? mipMaps = null) : ScratchImageReadbackEffect(readbackProvider) +{ + /// Constructs a , inferring the format from the path's extension. + /// Dalamud's texture readback provider. + /// The texture manager service. + /// The path to save at. + /// Which texture compression type to use. + /// Whether to add mipmaps to the saved texture. + public SaveToDdsTexFileEffect(ITextureReadbackProvider readbackProvider, TextureManager textureManager, string path, + CombinedTexture.TextureSaveType textureSaveType = CombinedTexture.TextureSaveType.AsIs, + bool? mipMaps = null) + : this(readbackProvider, textureManager, IsTex(path), path, textureSaveType, mipMaps) + { } + + /// + protected override async Task Run(ScratchImage scratch, CancellationToken cancellationToken) + { + var converted = textureSaveType switch + { + CombinedTexture.TextureSaveType.AsIs => mipMaps is { } mips ? TextureManager.AddMipMaps(scratch, mips) : scratch, + CombinedTexture.TextureSaveType.Bitmap => TextureManager.CreateUncompressed(scratch, mipMaps ?? false, cancellationToken), + CombinedTexture.TextureSaveType.BC1 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC1UNorm, + cancellationToken), + CombinedTexture.TextureSaveType.BC3 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC3UNorm, + cancellationToken), + CombinedTexture.TextureSaveType.BC4 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC4UNorm, + cancellationToken), + CombinedTexture.TextureSaveType.BC5 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC5UNorm, + cancellationToken), + CombinedTexture.TextureSaveType.BC7 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC7UNorm, + cancellationToken), + _ => throw new Exception("Wrong save type."), + }; + + try + { + if (asTex) + TextureManager.SaveTex(path, converted); + else + converted.SaveDDS(path); + } + finally + { + if (converted != scratch) + converted.Dispose(); + } + } + + private static bool IsTex(string? path) + => Path.GetExtension(path)?.ToLowerInvariant() is ".tex" or ".atex"; +} diff --git a/Penumbra/Import/Textures/SaveToScratchImageEffect.cs b/Penumbra/Import/Textures/SaveToScratchImageEffect.cs new file mode 100644 index 000000000..d751d50aa --- /dev/null +++ b/Penumbra/Import/Textures/SaveToScratchImageEffect.cs @@ -0,0 +1,63 @@ +using Dalamud.Interface.Textures.TextureWraps; +using Dalamud.Plugin.Services; +using ImSharp; +using Luna.DirectX; +using OtterTex; +using Penumbra.Util; + +namespace Penumbra.Import.Textures; + +/// An image processing effect that saves its input to a . +/// Dalamud's texture readback provider. +/// +public abstract class SaveToScratchImageEffect(ITextureReadbackProvider readbackProvider) : WrapEffectBase, IDisposable +{ + private ScratchImage? _scratch; + + /// The last run's image. + public ScratchImage? ScratchImage + => _scratch; + + /// + public override int Count + => 0; + + /// + public override ImTextureId this[int index] + => throw new NotSupportedException(); + + ~SaveToScratchImageEffect() + => Dispose(false); + + /// Gets the last run's image, transferring its ownership to the caller. + public ScratchImage? DetachScratchImage() + { + var scratch = _scratch; + _scratch = null; + return scratch; + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// Releases the resources used by this object. + /// True if called explicitly, false if garbage collected. + protected virtual void Dispose(bool disposing) + { + _scratch?.Dispose(); + _scratch = null; + } + + /// + protected override async Task Run(IDalamudTextureWrap wrap, CancellationToken cancellationToken) + { + var scratch = await readbackProvider.GetScratchImageAsync(wrap, true, cancellationToken) + .ConfigureAwait(false); + _scratch?.Dispose(); + _scratch = scratch; + } +} diff --git a/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs b/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs new file mode 100644 index 000000000..9a12f44a0 --- /dev/null +++ b/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs @@ -0,0 +1,37 @@ +using Dalamud.Interface.Textures.TextureWraps; +using Dalamud.Plugin.Services; +using ImSharp; +using Luna.DirectX; +using OtterTex; +using Penumbra.Util; + +namespace Penumbra.Import.Textures; + +/// Base class for effects that retrieve the pixel data as a and process it on the CPU side. +/// Dalamud's texture readback provider. +/// +public abstract class ScratchImageReadbackEffect(ITextureReadbackProvider readbackProvider) : WrapEffectBase +{ + /// + public override int Count + => 0; + + /// + public override ImTextureId this[int index] + => throw new NotSupportedException(); + + /// + protected override async Task Run(IDalamudTextureWrap wrap, CancellationToken cancellationToken) + { + using var scratch = await readbackProvider.GetScratchImageAsync(wrap, true, cancellationToken) + .ConfigureAwait(false); + cancellationToken.ThrowIfCancellationRequested(); + await Run(scratch, cancellationToken).ConfigureAwait(false); + } + + /// Runs this effect. + /// The input texture. + /// A cancellation token. + /// A task that represents this effect running. + protected abstract Task Run(ScratchImage scratch, CancellationToken cancellationToken); +} diff --git a/Penumbra/Import/Textures/TexFileParser.cs b/Penumbra/Import/Textures/TexFileParser.cs index f1338c9eb..22145d93d 100644 --- a/Penumbra/Import/Textures/TexFileParser.cs +++ b/Penumbra/Import/Textures/TexFileParser.cs @@ -247,9 +247,9 @@ public static TexFile.TextureFormat ToTexFormat(this DXGIFormat format) DXGIFormat.BC1UNorm => TexFile.TextureFormat.BC1, DXGIFormat.BC2UNorm => TexFile.TextureFormat.BC2, DXGIFormat.BC3UNorm => TexFile.TextureFormat.BC3, - DXGIFormat.BC4UNorm => (TexFile.TextureFormat)0x6120, // TODO: upstream to Lumina + DXGIFormat.BC4UNorm => TexFile.TextureFormat.BC4, DXGIFormat.BC5UNorm => TexFile.TextureFormat.BC5, - DXGIFormat.BC6HSF16 => (TexFile.TextureFormat)0x6330, // TODO: upstream to Lumina + DXGIFormat.BC6HSF16 => TexFile.TextureFormat.BC6H, DXGIFormat.BC7UNorm => TexFile.TextureFormat.BC7, DXGIFormat.R16G16B16A16Typeless => TexFile.TextureFormat.D16, DXGIFormat.R24G8Typeless => TexFile.TextureFormat.D24S8, @@ -274,9 +274,9 @@ public static DXGIFormat ToDXGI(this TexFile.TextureFormat format) TexFile.TextureFormat.BC1 => DXGIFormat.BC1UNorm, TexFile.TextureFormat.BC2 => DXGIFormat.BC2UNorm, TexFile.TextureFormat.BC3 => DXGIFormat.BC3UNorm, - (TexFile.TextureFormat)0x6120 => DXGIFormat.BC4UNorm, // TODO: upstream to Lumina + TexFile.TextureFormat.BC4 => DXGIFormat.BC4UNorm, TexFile.TextureFormat.BC5 => DXGIFormat.BC5UNorm, - (TexFile.TextureFormat)0x6330 => DXGIFormat.BC6HSF16, // TODO: upstream to Lumina + TexFile.TextureFormat.BC6H => DXGIFormat.BC6HSF16, TexFile.TextureFormat.BC7 => DXGIFormat.BC7UNorm, TexFile.TextureFormat.D16 => DXGIFormat.R16G16B16A16Typeless, TexFile.TextureFormat.D24S8 => DXGIFormat.R24G8Typeless, diff --git a/Penumbra/Import/Textures/TextureManager.cs b/Penumbra/Import/Textures/TextureManager.cs index ce66922df..1e42688f4 100644 --- a/Penumbra/Import/Textures/TextureManager.cs +++ b/Penumbra/Import/Textures/TextureManager.cs @@ -2,15 +2,23 @@ using Dalamud.Interface.Textures; using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Plugin.Services; +using ImSharp; using Lumina.Data.Files; using Luna; +using Luna.DirectX; using OtterTex; using TerraFX.Interop.DirectX; using TerraFX.Interop.Windows; namespace Penumbra.Import.Textures; -public sealed class TextureManager(IDataManager gameData, LunaLogger logger, ITextureProvider textureProvider, IUiBuilder uiBuilder) +public sealed class TextureManager( + IDataManager gameData, + LunaLogger logger, + ITextureProvider textureProvider, + IUiBuilder uiBuilder, + IFramework framework, + Configuration configuration) : SingleTaskQueue, IDisposable, IService { private readonly LunaLogger _logger = logger; @@ -19,6 +27,8 @@ public sealed class TextureManager(IDataManager gameData, LunaLogger logger, ITe private readonly ConcurrentDictionary _tasks = new(); private bool _disposed; + private ComPtr _auxDevice; + public IReadOnlyDictionary Tasks => _tasks; @@ -28,6 +38,11 @@ public void Dispose() foreach (var (_, cancel) in _tasks.Values.ToArray()) cancel.Cancel(); _tasks.Clear(); + if (_auxDevice.Valid) + { + _auxDevice.Dispose(); + configuration.AuxiliaryDeviceModeChanged -= OnAuxiliaryDeviceModeChanged; + } } public Task SavePng(string input, string output) @@ -69,6 +84,9 @@ public Task SaveAs(CombinedTexture.TextureSaveType type, bool mipMaps, bool asTe int width = 0, int height = 0) => Enqueue(new SaveAsAction(this, type, mipMaps, asTex, image, output, rgba, width, height)); + public Task RunEffectGraph(EffectGraph graph) + => Enqueue(new RunEffectGraphAction(graph, framework)); + private Task Enqueue(IAction action) { if (_disposed) @@ -305,6 +323,17 @@ public override int GetHashCode() => HashCode.Combine(_outputPath?.ToLowerInvariant(), _outputStream, _type, _mipMaps, _asTex, _input); } + private sealed class RunEffectGraphAction(EffectGraph graph, IFramework framework) : IAction + { + private readonly EffectGraph _graph = graph; + + public bool Equals(IAction? other) + => other is RunEffectGraphAction rhs && _graph == rhs._graph; + + public void Execute(CancellationToken token) + => _graph.Run(framework, token).Wait(token); + } + /// Load a texture wrap for a given image. public IDalamudTextureWrap LoadTextureWrap(BaseImage image, byte[]? rgba = null, int width = 0, int height = 0) { @@ -476,8 +505,56 @@ public static ScratchImage CreateUncompressed(ScratchImage input, bool mipMaps, return AddMipMaps(input, mipMaps); } + private void OnAuxiliaryDeviceModeChanged(AuxiliaryDeviceMode newMode, AuxiliaryDeviceMode oldMode) + { + if (_auxDevice.Valid && newMode is not AuxiliaryDeviceMode.Singleton) + { + _auxDevice.Dispose(); + configuration.AuxiliaryDeviceModeChanged -= OnAuxiliaryDeviceModeChanged; + } + } + + private unsafe ComPtr GetAuxiliaryDevice() + { + switch (configuration.AuxiliaryDeviceMode) + { + case AuxiliaryDeviceMode.Transient: + var clone = new ComPtr(); + CloneDevice((ID3D11Device*)uiBuilder.DeviceHandle, clone.GetAddressOf()); + return clone; + case AuxiliaryDeviceMode.Singleton: + if (!_auxDevice.Valid) + { + configuration.AuxiliaryDeviceModeChanged += OnAuxiliaryDeviceModeChanged; + CloneDevice((ID3D11Device*)uiBuilder.DeviceHandle, _auxDevice.GetAddressOf()); + } + + return new ComPtr(_auxDevice); + case AuxiliaryDeviceMode.Borrowed: return new ComPtr((ID3D11Device*)uiBuilder.DeviceHandle); + default: return default; + } + } + + private unsafe bool CanUseAuxiliaryDeviceImmediately() + => configuration.AuxiliaryDeviceMode is not AuxiliaryDeviceMode.Borrowed + || framework.IsInFrameworkUpdateThread && Im.Context.Pointer->WithinFrameScope; + + private static unsafe void CloneDevice(ID3D11Device* device, ID3D11Device** clone) + { + using var adapter = new ComPtr(); + using (var dxgiDevice = new ComPtr()) + { + Marshal.ThrowExceptionForHR(DxUtility.NonOwningComPtr(device).As(&dxgiDevice)); + Marshal.ThrowExceptionForHR(dxgiDevice.Get()->GetAdapter(adapter.GetAddressOf())); + } + + var featureLevel = device->GetFeatureLevel(); + Marshal.ThrowExceptionForHR(DirectX.D3D11CreateDevice(adapter, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_UNKNOWN, HMODULE.NULL, + device->GetCreationFlags(), &featureLevel, 1, D3D11.D3D11_SDK_VERSION, clone, null, null)); + } + /// Create a BC3 or BC7 block-compressed .dds from the input (optionally with mipmaps). Returns input (+ mipmaps) if it is already the correct format. - public unsafe ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel) + public ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel) { if (input.Meta.Format == format) return input; @@ -493,61 +570,79 @@ public unsafe ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DX // See https://github.com/microsoft/DirectXTex/wiki/Compress#parameters for the format condition. if (format is DXGIFormat.BC6HUF16 or DXGIFormat.BC6HSF16 or DXGIFormat.BC7UNorm or DXGIFormat.BC7UNormSRGB) { - ref var device = ref *(ID3D11Device*)uiBuilder.DeviceHandle; - IDXGIDevice* dxgiDevice; - Marshal.ThrowExceptionForHR(device.QueryInterface(TerraFX.Interop.Windows.Windows.__uuidof(), (void**)&dxgiDevice)); + var immediate = CanUseAuxiliaryDeviceImmediately(); + if (!immediate && framework.IsInFrameworkUpdateThread) + throw new InvalidOperationException("TextureManager's auxiliary Direct3D device is not ready"); + using var auxDevice = GetAuxiliaryDevice(); + if (auxDevice.Valid) + { + return immediate + ? Compress(input, auxDevice, format, CompressFlags.Parallel) + : CompressAsync(input, auxDevice, format, CompressFlags.Parallel).Result; + } + } + return input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel); + } + + public Task CreateCompressedAsync(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel) + { + if (input.Meta.Format == format) + return Task.FromResult(input); + + if (input.Meta.Format.IsCompressed()) + { + input = input.Decompress(DXGIFormat.B8G8R8A8UNorm); + cancel.ThrowIfCancellationRequested(); + } + + input = AddMipMaps(input, mipMaps); + cancel.ThrowIfCancellationRequested(); + // See https://github.com/microsoft/DirectXTex/wiki/Compress#parameters for the format condition. + if (format is DXGIFormat.BC6HUF16 or DXGIFormat.BC6HSF16 or DXGIFormat.BC7UNorm or DXGIFormat.BC7UNormSRGB) + { + using var auxDevice = GetAuxiliaryDevice(); + if (auxDevice.Valid) + { + return CanUseAuxiliaryDeviceImmediately() + ? Task.FromResult(Compress(input, auxDevice, format, CompressFlags.Parallel)) + : CompressAsync(input, auxDevice, format, CompressFlags.Parallel); + } + } + + return Task.FromResult(input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel)); + } + + private static unsafe ScratchImage Compress(ScratchImage input, ComPtr device, DXGIFormat format, + CompressFlags compressFlags = CompressFlags.Default, float alphaWeight = 1.0f) + => input.Compress((nint)device.Get(), format, compressFlags, alphaWeight); + + private Task CompressAsync(ScratchImage input, ComPtr device, DXGIFormat format, + CompressFlags compressFlags = CompressFlags.Default, float alphaWeight = 1.0f) + { + var deviceAsync = new ComPtr(device); + var tcs = new TaskCompletionSource(); + Action action = null!; + + action = () => + { + uiBuilder.Draw -= action; try { - IDXGIAdapter* adapter = null; - Marshal.ThrowExceptionForHR(dxgiDevice->GetAdapter(&adapter)); - try - { - dxgiDevice->Release(); - dxgiDevice = null; - - ID3D11Device* deviceClone = null; - ID3D11DeviceContext* contextClone = null; - var featureLevel = device.GetFeatureLevel(); - Marshal.ThrowExceptionForHR(DirectX.D3D11CreateDevice( - adapter, - D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_UNKNOWN, - HMODULE.NULL, - device.GetCreationFlags(), - &featureLevel, - 1, - D3D11.D3D11_SDK_VERSION, - &deviceClone, - null, - &contextClone)); - try - { - adapter->Release(); - adapter = null; - return input.Compress((nint)deviceClone, format, CompressFlags.Parallel); - } - finally - { - if (contextClone is not null) - contextClone->Release(); - if (deviceClone is not null) - deviceClone->Release(); - } - } - finally - { - if (adapter is not null) - adapter->Release(); - } + tcs.SetResult(Compress(input, deviceAsync, format, compressFlags, alphaWeight)); + } + catch (Exception e) + { + tcs.SetException(e); } finally { - if (dxgiDevice is not null) - dxgiDevice->Release(); + deviceAsync.Dispose(); } - } + }; - return input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel); + uiBuilder.Draw += action; + return tcs.Task; } diff --git a/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs b/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs index 970a8fd90..6f6a96b14 100644 --- a/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs +++ b/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs @@ -2,10 +2,10 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.System.Resource; +using Luna; using Penumbra.Api.Enums; using Penumbra.Interop.Hooks.ResourceLoading; using Penumbra.Interop.PathResolving; -using Penumbra.Interop.SafeHandles; using Penumbra.String; using Penumbra.String.Classes; using CharacterUtility = Penumbra.Interop.Services.CharacterUtility; @@ -62,7 +62,7 @@ private void SetupHssReplacements(CharacterBase* drawObject, uint slotIndex, Spa if (!_framework.IsInFrameworkUpdateThread) Penumbra.Log.Warning( $"{nameof(PreBoneDeformerReplacer)}.{nameof(SetupHssReplacements)}(0x{(nint)drawObject:X}, {slotIndex}) called out of framework thread"); - + var preBoneDeformer = GetPreBoneDeformerForCharacter(drawObject); try { diff --git a/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs b/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs index e724ebc74..d27fc5b6b 100644 --- a/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs +++ b/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs @@ -1,9 +1,9 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource; +using Luna; using Penumbra.Api.Enums; using Penumbra.Collections; using Penumbra.Interop.Hooks.Resources; using Penumbra.Interop.PathResolving; -using Penumbra.Interop.SafeHandles; using Penumbra.Interop.Structs; using Penumbra.String; using Penumbra.String.Classes; diff --git a/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs b/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs index 1700b980a..df5b87a91 100644 --- a/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs +++ b/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs @@ -2,9 +2,9 @@ using Dalamud.Plugin.Services; using Dalamud.Utility.Signatures; using FFXIVClientStructs.FFXIV.Client.System.Resource; +using Luna; using Penumbra.Api.Enums; using Penumbra.GameData; -using Penumbra.Interop.SafeHandles; using Penumbra.Interop.Structs; using Penumbra.String; using Penumbra.String.Classes; diff --git a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs index bec0831af..2420e2b08 100644 --- a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs +++ b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs @@ -1,8 +1,8 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; +using Luna; using Penumbra.GameData.Interop; -using Penumbra.Interop.SafeHandles; namespace Penumbra.Interop.MaterialPreview; @@ -34,9 +34,9 @@ public LiveColorTablePreviewer(ObjectManager objects, IFramework framework, Mate throw new InvalidOperationException("Draw object doesn't have color table textures"); _colorTableTexture = colorSetTextures + (MaterialInfo.ModelSlot * CharacterBase.MaterialsPerSlot + MaterialInfo.MaterialSlot); - - _originalColorTableTexture = new SafeTextureHandle(*_colorTableTexture, true); + + _originalColorTableTexture = new SafeTextureHandle(*_colorTableTexture); if (_originalColorTableTexture.Texture == null) throw new InvalidOperationException("Material doesn't have a color table"); diff --git a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs index 13f6aaccc..4c44ed412 100644 --- a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs +++ b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs @@ -107,7 +107,7 @@ private static unsafe Model GetDrawObject(DrawObjectType type, Actor address) DrawObjectType.Character => address.Model, DrawObjectType.Mainhand => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.MainHand).DrawObject, DrawObjectType.Offhand => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.OffHand).DrawObject, - DrawObjectType.Vfx => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.Unk).DrawObject, + DrawObjectType.Vfx => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.System).DrawObject, _ => Model.Null, }; } diff --git a/Penumbra/Interop/PathResolving/CollectionResolver.cs b/Penumbra/Interop/PathResolving/CollectionResolver.cs index 5d7350697..ed80bde78 100644 --- a/Penumbra/Interop/PathResolving/CollectionResolver.cs +++ b/Penumbra/Interop/PathResolving/CollectionResolver.cs @@ -36,14 +36,14 @@ public sealed unsafe class CollectionResolver( /// public ModCollection PlayerCollection() { - var gameObject = objects[0]; + var gameObject = objects[0]; if (!gameObject.Valid) return collectionManager.Active.ByType(CollectionType.Yourself) ?? collectionManager.Active.Default; var player = actors.GetCurrentPlayer(); var _ = false; - return CollectionByIdentifier(player) + return CollectionByIdentifier(player, false) ?? CheckYourself(player, gameObject) ?? CollectionByAttributes(gameObject, ref _) ?? collectionManager.Active.Default; @@ -52,7 +52,7 @@ public ModCollection PlayerCollection() /// Identify the correct collection for a game object. public ResolveData IdentifyCollection(GameObject* gameObject, bool useCache) { - if (gameObject == null) + if (gameObject is null) return collectionManager.Active.Default.ToResolveData(); try @@ -107,7 +107,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret) { // Also check for empty names because sometimes named other characters // might be loaded before being officially logged in. - if (clientState.IsLoggedIn || gameObject->Name[0] != '\0') + if (clientState.IsLoggedIn || gameObject->Name[0] is not (byte)'\0') { ret = ResolveData.Invalid; return false; @@ -122,7 +122,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret) var notYetReady = false; var lobby = AgentLobby.Instance(); var characterList = CharaSelectCharacterList.Instance(); - if (lobby != null && characterList != null) + if (lobby is not null && characterList is not null) { // The lobby uses the first 8 cutscene actors. var idx = gameObject->ObjectIndex - ObjectIndex.CutsceneStart.Index; @@ -133,7 +133,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret) var identifier = actors.CreatePlayer(new ByteString(item->Name), item->HomeWorldId); Penumbra.Log.Excessive( $"Identified {identifier.Incognito(null)} in cutscene for actor {idx + 200} at 0x{(ulong)gameObject:X} of race {(gameObject->IsCharacter() ? ((Character*)gameObject)->DrawData.CustomizeData.Race.ToString() : "Unknown")}."); - if (identifier.IsValid && CollectionByIdentifier(identifier) is { } coll) + if (identifier.IsValid && CollectionByIdentifier(identifier, false) is { } coll) { // Do not add this to caches because game objects are reused for different draw objects. ret = coll.ToResolveData(gameObject); @@ -166,7 +166,7 @@ private bool Aesthetician(GameObject* gameObject, out ResolveData ret) var player = actors.GetCurrentPlayer(); var notYetReady = false; - var collection = (player.IsValid ? CollectionByIdentifier(player) : null) + var collection = (player.IsValid ? CollectionByIdentifier(player, false) : null) ?? collectionManager.Active.ByType(CollectionType.Yourself) ?? CollectionByAttributes(gameObject, ref notYetReady) ?? collectionManager.Active.Default; @@ -189,31 +189,32 @@ private ResolveData DefaultState(GameObject* gameObject) } var notYetReady = false; - var collection = CollectionByIdentifier(identifier) + var hostile = ((Actor)gameObject).IsHostile; + var collection = CollectionByIdentifier(identifier, hostile) ?? CheckYourself(identifier, gameObject) ?? CollectionByAttributes(gameObject, ref notYetReady) - ?? CheckOwnedCollection(identifier, owner, ref notYetReady) + ?? CheckOwnedCollection(identifier, owner, ref notYetReady, hostile) ?? collectionManager.Active.Default; return notYetReady ? collection.ToResolveData(gameObject) : cache.Set(collection, identifier, gameObject); } /// Check both temporary and permanent character collections. Temporary first. - private ModCollection? CollectionByIdentifier(ActorIdentifier identifier) + private ModCollection? CollectionByIdentifier(ActorIdentifier identifier, bool hostile) { - if (tempCollections.Collections.TryGetCollection(identifier, out var collection)) + if (tempCollections.Collections.TryGetCollection(identifier, out var collection, hostile)) return collection; - // Always inherit ownership for temporary collections. - if (identifier.Type is IdentifierType.Owned) + // Always inherit non-hostile ownership for temporary collections + if (identifier.Type is IdentifierType.Owned && !hostile) { var playerIdentifier = actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName, identifier.HomeWorld.Id, ObjectKind.None, uint.MaxValue); - if (tempCollections.Collections.TryGetCollection(playerIdentifier, out collection)) + if (tempCollections.Collections.TryGetCollection(playerIdentifier, out collection, hostile)) return collection; } - if (collectionManager.Active.Individuals.TryGetCollection(identifier, out collection)) + if (collectionManager.Active.Individuals.TryGetCollection(identifier, out collection, hostile)) return collection; return null; @@ -223,7 +224,7 @@ private ResolveData DefaultState(GameObject* gameObject) private ModCollection? CheckYourself(ActorIdentifier identifier, Actor actor) { if (actor.Index == 0 - || cutscenes.GetParentIndex(actor.Index.Index) == 0 + || cutscenes.GetParentIndex(actor.Index.Index) is 0 || identifier.Equals(actors.GetCurrentPlayer())) return collectionManager.Active.ByType(CollectionType.Yourself); @@ -244,7 +245,7 @@ private ResolveData DefaultState(GameObject* gameObject) if (!IsModelHuman((uint)actor.AsCharacter->ModelContainer.ModelCharaId)) return null; - if (actor.Customize->Data[0] == 0) + if (actor.Customize->Data[0] is 0) { notYetReady = true; return null; @@ -271,9 +272,12 @@ private ResolveData DefaultState(GameObject* gameObject) } /// Get the collection applying to the owner if it is available. - private ModCollection? CheckOwnedCollection(ActorIdentifier identifier, Actor owner, ref bool notYetReady) + private ModCollection? CheckOwnedCollection(ActorIdentifier identifier, Actor owner, ref bool notYetReady, bool hostile) { - if (identifier.Type != IdentifierType.Owned || !config.UseOwnerNameForCharacterCollection || !owner.Valid) + if (identifier.Type is not IdentifierType.Owned + || !config.UseOwnerNameForCharacterCollection + || hostile && !config.UseOwnerForHostiles + || !owner.Valid) return null; var id = actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName, identifier.HomeWorld.Id, diff --git a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs index dfd27d77e..0ed4b1af0 100644 --- a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs +++ b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs @@ -95,7 +95,7 @@ private unsafe Utf8GamePath ResolveMaterialPath(Utf8GamePath modelPath, Resource // Resolving a material path through the game's code can dereference null pointers for materials that involve IMC metadata. return ModelType switch { - ModelType.Human when IsEquipmentOrAccessorySlot(SlotIndex) && mtrlFileName[8] != (byte)'b' + ModelType.Human when IsEquipmentOrAccessorySlot(SlotIndex) && (SlotIndex >= 5 || mtrlFileName[8] != (byte)'b') => ResolveEquipmentMaterialPath(modelPath, imc, mtrlFileName), ModelType.DemiHuman => ResolveEquipmentMaterialPath(modelPath, imc, mtrlFileName), ModelType.Weapon => ResolveWeaponMaterialPath(modelPath, imc, mtrlFileName), diff --git a/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs b/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs deleted file mode 100644 index a5e73867d..000000000 --- a/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs +++ /dev/null @@ -1,41 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; - -namespace Penumbra.Interop.SafeHandles; - -public unsafe class SafeResourceHandle : SafeHandle, ICloneable -{ - public ResourceHandle* ResourceHandle - => (ResourceHandle*)handle; - - public override bool IsInvalid - => handle == 0; - - public SafeResourceHandle(ResourceHandle* handle, bool incRef, bool ownsHandle = true) - : base(0, ownsHandle) - { - if (incRef && !ownsHandle) - throw new ArgumentException("Non-owning SafeResourceHandle with IncRef is unsupported"); - - if (incRef && handle != null) - handle->IncRef(); - SetHandle((nint)handle); - } - - public SafeResourceHandle Clone() - => new(ResourceHandle, true); - - object ICloneable.Clone() - => Clone(); - - public static SafeResourceHandle CreateInvalid() - => new(null, false); - - protected override bool ReleaseHandle() - { - var handle = Interlocked.Exchange(ref this.handle, 0); - if (handle != 0) - ((ResourceHandle*)handle)->DecRef(); - - return true; - } -} diff --git a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs b/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs deleted file mode 100644 index fd0208047..000000000 --- a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs +++ /dev/null @@ -1,49 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; - -namespace Penumbra.Interop.SafeHandles; - -public unsafe class SafeTextureHandle : SafeHandle -{ - public Texture* Texture - => (Texture*)handle; - - public override bool IsInvalid - => handle == 0; - - public SafeTextureHandle(Texture* handle, bool incRef, bool ownsHandle = true) - : base(0, ownsHandle) - { - if (incRef && !ownsHandle) - throw new ArgumentException("Non-owning SafeTextureHandle with IncRef is unsupported"); - - if (incRef && handle != null) - handle->IncRef(); - SetHandle((nint)handle); - } - - public void Exchange(ref nint ppTexture) - { - lock (this) - { - handle = Interlocked.Exchange(ref ppTexture, handle); - } - } - - public static SafeTextureHandle CreateInvalid() - => new(null, false); - - protected override bool ReleaseHandle() - { - nint handle; - lock (this) - { - handle = this.handle; - this.handle = 0; - } - - if (handle != 0) - ((Texture*)handle)->DecRef(); - - return true; - } -} diff --git a/Penumbra/Interop/Services/CharacterUtility.cs b/Penumbra/Interop/Services/CharacterUtility.cs index 26e47d296..b7c9d2322 100644 --- a/Penumbra/Interop/Services/CharacterUtility.cs +++ b/Penumbra/Interop/Services/CharacterUtility.cs @@ -157,5 +157,8 @@ public void ResetAll() } public void Dispose() - => ResetAll(); + { + _framework.Update -= LoadDefaultResources; + ResetAll(); + } } diff --git a/Penumbra/Meta/Manipulations/AtchIdentifier.cs b/Penumbra/Meta/Manipulations/AtchIdentifier.cs index 0cc4f7ab9..f275d03a4 100644 --- a/Penumbra/Meta/Manipulations/AtchIdentifier.cs +++ b/Penumbra/Meta/Manipulations/AtchIdentifier.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.GameData.Enums; @@ -18,11 +19,11 @@ public ModelRace Race public int CompareTo(AtchIdentifier other) { var typeComparison = Type.CompareTo(other.Type); - if (typeComparison != 0) + if (typeComparison is not 0) return typeComparison; var genderRaceComparison = GenderRace.CompareTo(other.GenderRace); - if (genderRaceComparison != 0) + if (genderRaceComparison is not 0) return genderRaceComparison; return EntryIndex.CompareTo(other.EntryIndex); @@ -41,9 +42,12 @@ public MetaIndex FileIndex() public bool Validate() { + if (EntryIndex is ushort.MaxValue || GenderRace is GenderRace.Unknown || Type is AtchType.Unknown) + return false; + var race = (int)GenderRace / 100; var remainder = (int)GenderRace - 100 * race; - if (remainder != 1) + if (remainder is not 1) return false; return race is >= 0 and <= 18; @@ -52,13 +56,23 @@ public bool Validate() public JObject AddToJson(JObject jObj) { var (gender, race) = GenderRace.Split(); - jObj["Gender"] = gender.ToString(); - jObj["Race"] = race.ToString(); + jObj["Gender"] = gender.String; + jObj["Race"] = race.String; jObj["Type"] = Type.ToAbbreviation(); jObj["Index"] = EntryIndex; return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + var (gender, race) = GenderRace.Split(); + j.WriteString("Gender"u8, gender.StringU8); + j.WriteString("Race"u8, race.StringU8); + j.WriteString("Type"u8, Type.ToAbbreviation()); + j.WriteNumber("Index"u8, EntryIndex); + return j; + } + public static AtchIdentifier? FromJson(JObject jObj) { var gender = jObj["Gender"]?.ToObject() ?? Gender.Unknown; diff --git a/Penumbra/Meta/Manipulations/AtrIdentifier.cs b/Penumbra/Meta/Manipulations/AtrIdentifier.cs index fc8246e70..a55f31127 100644 --- a/Penumbra/Meta/Manipulations/AtrIdentifier.cs +++ b/Penumbra/Meta/Manipulations/AtrIdentifier.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Penumbra.Collections.Cache; @@ -110,6 +111,18 @@ public JObject AddToJson(JObject jObj) return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + if (Slot is not HumanSlot.Unknown) + j.WriteString("Slot"u8, Slot.StringU8); + if (Id.HasValue) + j.WriteNumber("Id"u8, Id.Value.Id); + j.WriteString("Attribute"u8, Attribute.AsSpan); + if (GenderRaceCondition is not GenderRace.Unknown) + j.WriteNumber("GenderRaceCondition"u8, (uint)GenderRaceCondition); + return j; + } + public static AtrIdentifier? FromJson(JObject jObj) { var attribute = jObj["Attribute"]?.ToObject(); diff --git a/Penumbra/Meta/Manipulations/Eqdp.cs b/Penumbra/Meta/Manipulations/Eqdp.cs index 250e589da..141292dea 100644 --- a/Penumbra/Meta/Manipulations/Eqdp.cs +++ b/Penumbra/Meta/Manipulations/Eqdp.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.GameData.Enums; @@ -30,7 +31,7 @@ public bool Validate() if (mask == 0) return false; - if (FileIndex() == (MetaIndex)(-1)) + if (FileIndex() is (MetaIndex)(-1)) return false; // No check for set id. @@ -40,11 +41,11 @@ public bool Validate() public int CompareTo(EqdpIdentifier other) { var gr = GenderRace.CompareTo(other.GenderRace); - if (gr != 0) + if (gr is not 0) return gr; var set = SetId.Id.CompareTo(other.SetId.Id); - if (set != 0) + if (set is not 0) return set; return Slot.CompareTo(other.Slot); @@ -63,13 +64,23 @@ public int CompareTo(EqdpIdentifier other) public JObject AddToJson(JObject jObj) { var (gender, race) = GenderRace.Split(); - jObj["Gender"] = gender.ToString(); - jObj["Race"] = race.ToString(); - jObj["SetId"] = SetId.Id.ToString(); - jObj["Slot"] = Slot.ToString(); + jObj["Gender"] = gender.String; + jObj["Race"] = race.String; + jObj["SetId"] = SetId.Id; + jObj["Slot"] = Slot.String; return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + var (gender, race) = GenderRace.Split(); + j.WriteString("Gender"u8, gender.StringU8); + j.WriteString("Race"u8, race.StringU8); + j.WriteNumber("SetId"u8, SetId.Id); + j.WriteString("Slot"u8, Slot.StringU8); + return j; + } + public MetaManipulationType Type => MetaManipulationType.Eqdp; } diff --git a/Penumbra/Meta/Manipulations/Eqp.cs b/Penumbra/Meta/Manipulations/Eqp.cs index fc0181a23..5a01e69b2 100644 --- a/Penumbra/Meta/Manipulations/Eqp.cs +++ b/Penumbra/Meta/Manipulations/Eqp.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.GameData.Enums; @@ -20,7 +21,7 @@ public override string ToString() public bool Validate() { var mask = Eqp.Mask(Slot); - if (mask == 0) + if (mask is 0) return false; // No check for set id. @@ -30,7 +31,7 @@ public bool Validate() public int CompareTo(EqpIdentifier other) { var set = SetId.Id.CompareTo(other.SetId.Id); - if (set != 0) + if (set is not 0) return set; return Slot.CompareTo(other.Slot); @@ -46,11 +47,18 @@ public int CompareTo(EqpIdentifier other) public JObject AddToJson(JObject jObj) { - jObj["SetId"] = SetId.Id.ToString(); - jObj["Slot"] = Slot.ToString(); + jObj["SetId"] = SetId.Id; + jObj["Slot"] = Slot.String; return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + j.WriteNumber("SetId"u8, SetId.Id); + j.WriteString("Slot"u8, Slot.StringU8); + return j; + } + public MetaManipulationType Type => MetaManipulationType.Eqp; } diff --git a/Penumbra/Meta/Manipulations/Est.cs b/Penumbra/Meta/Manipulations/Est.cs index ff18f2113..ce17fbee4 100644 --- a/Penumbra/Meta/Manipulations/Est.cs +++ b/Penumbra/Meta/Manipulations/Est.cs @@ -1,3 +1,4 @@ +using ImSharp; using Luna.Generators; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -92,13 +93,23 @@ public int CompareTo(EstIdentifier other) public JObject AddToJson(JObject jObj) { var (gender, race) = GenderRace.Split(); - jObj["Gender"] = gender.ToString(); - jObj["Race"] = race.ToString(); - jObj["SetId"] = SetId.Id.ToString(); - jObj["Slot"] = Slot.ToString(); + jObj["Gender"] = gender.String; + jObj["Race"] = race.String; + jObj["SetId"] = SetId.Id; + jObj["Slot"] = Slot.String; return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + var (gender, race) = GenderRace.Split(); + j.WriteString("Gender"u8, gender.StringU8); + j.WriteString("Race"u8, race.StringU8); + j.WriteNumber("SetId"u8, SetId.Id); + j.WriteString("Slot"u8, Slot.StringU8); + return j; + } + public MetaManipulationType Type => MetaManipulationType.Est; } diff --git a/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs b/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs index 57ff8aae9..dc31c9117 100644 --- a/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs +++ b/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs @@ -1,3 +1,5 @@ +using System.Text.Json; +using ImSharp; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.GameData.Enums; @@ -13,7 +15,7 @@ namespace Penumbra.Meta.Manipulations; public bool Validate() { - if (!Enum.IsDefined(Type)) + if (!Type.Defined) return false; if (Type.HasCondition()) @@ -25,10 +27,19 @@ public bool Validate() public JObject AddToJson(JObject jObj) { jObj[nameof(Type)] = Type.ToString(); - jObj[nameof(Condition)] = Condition.Id; + if (Type.HasCondition() && Condition.Id is not 0) + jObj[nameof(Condition)] = Condition.Id; return jObj; } + public Utf8JsonWriter AddToJson(Utf8JsonWriter j) + { + j.WriteString("Type"u8, Type.StringU8); + if(Type.HasCondition() && Condition.Id is not 0) + j.WriteNumber("Condition"u8, Condition.Id); + return j; + } + public static GlobalEqpManipulation? FromJson(JObject? jObj) { if (jObj == null) @@ -52,7 +63,7 @@ public bool Equals(GlobalEqpManipulation other) public int CompareTo(GlobalEqpManipulation other) { var typeComp = Type.CompareTo(other); - return typeComp != 0 ? typeComp : Condition.Id.CompareTo(other.Condition.Id); + return typeComp is not 0 ? typeComp : Condition.Id.CompareTo(other.Condition.Id); } public override bool Equals(object? obj) diff --git a/Penumbra/Meta/Manipulations/Gmp.cs b/Penumbra/Meta/Manipulations/Gmp.cs index 53c1bf7d4..461eecf53 100644 --- a/Penumbra/Meta/Manipulations/Gmp.cs +++ b/Penumbra/Meta/Manipulations/Gmp.cs @@ -33,10 +33,16 @@ public int CompareTo(GmpIdentifier other) public JObject AddToJson(JObject jObj) { - jObj["SetId"] = SetId.Id.ToString(); + jObj["SetId"] = SetId.Id; return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + j.WriteNumber("SetId"u8, SetId.Id); + return j; + } + public MetaManipulationType Type => MetaManipulationType.Gmp; } diff --git a/Penumbra/Meta/Manipulations/IMetaIdentifier.cs b/Penumbra/Meta/Manipulations/IMetaIdentifier.cs index 450aead92..88eb83363 100644 --- a/Penumbra/Meta/Manipulations/IMetaIdentifier.cs +++ b/Penumbra/Meta/Manipulations/IMetaIdentifier.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.Interop.Structs; @@ -28,6 +29,7 @@ public interface IMetaIdentifier public bool Validate(); public JObject AddToJson(JObject jObj); + public Utf8JsonWriter AddToJson(Utf8JsonWriter j); public MetaManipulationType Type { get; } diff --git a/Penumbra/Meta/Manipulations/Imc.cs b/Penumbra/Meta/Manipulations/Imc.cs index dbcd53478..744fa017d 100644 --- a/Penumbra/Meta/Manipulations/Imc.cs +++ b/Penumbra/Meta/Manipulations/Imc.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; using Penumbra.GameData.Enums; @@ -35,16 +36,16 @@ public void AddChangedItems(ObjectIdentification identifier, IDictionary GamePaths.Mdl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot), - ObjectType.Equipment => GamePaths.Mtrl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"), + ObjectType.Equipment => GamePaths.Mtrl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"), ObjectType.Accessory when allVariants => GamePaths.Mdl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot), - ObjectType.Accessory => GamePaths.Mtrl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"), - ObjectType.Weapon => GamePaths.Mtrl.Weapon(PrimaryId, SecondaryId.Id, Variant, "a"), + ObjectType.Accessory => GamePaths.Mtrl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"), + ObjectType.Weapon => GamePaths.Mtrl.Weapon(PrimaryId, SecondaryId.Id, Variant, "a"), ObjectType.DemiHuman => GamePaths.Mtrl.DemiHuman(PrimaryId, SecondaryId.Id, EquipSlot, Variant, "a"), ObjectType.Monster => GamePaths.Mtrl.Monster(PrimaryId, SecondaryId.Id, Variant, "a"), _ => string.Empty, }; - if (path.Length == 0) + if (path.Length is 0) return; identifier.Identify(changedItems, path); @@ -66,8 +67,8 @@ public string ToStringWithoutImc() => ObjectType switch { ObjectType.Equipment or ObjectType.Accessory => $"{PrimaryId} - {EquipSlot.ToName()} - {Variant}", - ObjectType.DemiHuman => $"{PrimaryId} - DemiHuman - {SecondaryId} - {EquipSlot.ToName()} - {Variant}", - _ => $"{PrimaryId} - {ObjectType.ToName()} - {SecondaryId} - {BodySlot} - {Variant}", + ObjectType.DemiHuman => $"{PrimaryId} - DemiHuman - {SecondaryId} - {EquipSlot.ToName()} - {Variant}", + _ => $"{PrimaryId} - {ObjectType.ToName()} - {SecondaryId} - {BodySlot} - {Variant}", }; public bool Validate() @@ -110,32 +111,32 @@ public bool Validate() public int CompareTo(ImcIdentifier other) { var o = ObjectType.CompareTo(other.ObjectType); - if (o != 0) + if (o is not 0) return o; var i = PrimaryId.Id.CompareTo(other.PrimaryId.Id); - if (i != 0) + if (i is not 0) return i; if (ObjectType is ObjectType.Equipment or ObjectType.Accessory) { var e = EquipSlot.CompareTo(other.EquipSlot); - return e != 0 ? e : Variant.Id.CompareTo(other.Variant.Id); + return e is not 0 ? e : Variant.Id.CompareTo(other.Variant.Id); } if (ObjectType is ObjectType.DemiHuman) { var e = EquipSlot.CompareTo(other.EquipSlot); - if (e != 0) + if (e is not 0) return e; } var s = SecondaryId.Id.CompareTo(other.SecondaryId.Id); - if (s != 0) + if (s is not 0) return s; var b = BodySlot.CompareTo(other.BodySlot); - return b != 0 ? b : Variant.Id.CompareTo(other.Variant.Id); + return b is not 0 ? b : Variant.Id.CompareTo(other.Variant.Id); } public static ImcIdentifier? FromJson(JObject? jObj) @@ -182,15 +183,46 @@ public int CompareTo(ImcIdentifier other) public JObject AddToJson(JObject jObj) { - jObj["ObjectType"] = ObjectType.ToString(); - jObj["PrimaryId"] = PrimaryId.Id; - jObj["SecondaryId"] = SecondaryId.Id; - jObj["Variant"] = Variant.Id; - jObj["EquipSlot"] = EquipSlot.ToString(); - jObj["BodySlot"] = BodySlot.ToString(); + jObj["ObjectType"] = ObjectType.String; + jObj["PrimaryId"] = PrimaryId.Id; + jObj["Variant"] = Variant.Id; + switch (ObjectType) + { + case ObjectType.Equipment or ObjectType.Accessory: jObj["EquipSlot"] = EquipSlot.String; break; + case ObjectType.Monster or ObjectType.Weapon: + jObj["SecondaryId"] = SecondaryId.Id; + jObj["BodySlot"] = BodySlot.String; + break; + case ObjectType.DemiHuman: + jObj["SecondaryId"] = SecondaryId.Id; + jObj["EquipSlot"] = EquipSlot.String; + break; + } + return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + j.WriteString("ObjectType"u8, ObjectType.StringU8); + j.WriteNumber("PrimaryId"u8, PrimaryId.Id); + j.WriteNumber("Variant"u8, Variant.Id); + switch (ObjectType) + { + case ObjectType.Equipment or ObjectType.Accessory: j.WriteString("EquipSlot"u8, EquipSlot.StringU8); break; + case ObjectType.Monster or ObjectType.Weapon: + j.WriteNumber("SecondaryId"u8, SecondaryId.Id); + j.WriteString("BodySlot"u8, BodySlot.StringU8); + break; + case ObjectType.DemiHuman: + j.WriteNumber("SecondaryId"u8, SecondaryId.Id); + j.WriteString("EquipSlot"u8, EquipSlot.StringU8); + break; + } + + return j; + } + public MetaManipulationType Type => MetaManipulationType.Imc; } diff --git a/Penumbra/Meta/Manipulations/Rsp.cs b/Penumbra/Meta/Manipulations/Rsp.cs index 743eb9c9d..b4a3c4c82 100644 --- a/Penumbra/Meta/Manipulations/Rsp.cs +++ b/Penumbra/Meta/Manipulations/Rsp.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Penumbra.GameData.Data; @@ -27,6 +28,13 @@ public JObject AddToJson(JObject jObj) return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + j.WriteString("SubRace"u8, SubRace.StringU8); + j.WriteString("Attribute"u8, Attribute.StringU8); + return j; + } + public static RspIdentifier? FromJson(JObject? jObj) { if (jObj == null) @@ -38,6 +46,8 @@ public JObject AddToJson(JObject jObj) return ret.Validate() ? ret : null; } + + public MetaManipulationType Type => MetaManipulationType.Rsp; diff --git a/Penumbra/Meta/Manipulations/ShpIdentifier.cs b/Penumbra/Meta/Manipulations/ShpIdentifier.cs index 6098f0b0e..e2c80aaea 100644 --- a/Penumbra/Meta/Manipulations/ShpIdentifier.cs +++ b/Penumbra/Meta/Manipulations/ShpIdentifier.cs @@ -1,3 +1,4 @@ +using ImSharp; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; @@ -106,13 +107,13 @@ public MetaIndex FileIndex() public bool Validate() { - if (!Enum.IsDefined(Slot) || Slot is HumanSlot.UnkBonus) + if (!Slot.Defined || Slot is HumanSlot.UnkBonus) return false; if (!ShapeAttributeHashSet.GenderRaceIndices.ContainsKey(GenderRaceCondition)) return false; - if (!Enum.IsDefined(ConnectorCondition)) + if (!ConnectorCondition.Defined) return false; if (Slot is HumanSlot.Unknown && Id is not null) @@ -142,7 +143,7 @@ public JObject AddToJson(JObject jObj) if (Slot is not HumanSlot.Unknown) jObj["Slot"] = Slot.ToString(); if (Id.HasValue) - jObj["Id"] = Id.Value.Id.ToString(); + jObj["Id"] = Id.Value.Id; jObj["Shape"] = Shape.ToString(); if (ConnectorCondition is not ShapeConnectorCondition.None) jObj["ConnectorCondition"] = ConnectorCondition.ToString(); @@ -151,6 +152,20 @@ public JObject AddToJson(JObject jObj) return jObj; } + public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j) + { + if (Slot is not HumanSlot.Unknown) + j.WriteString("Slot"u8, Slot.StringU8); + if (Id.HasValue) + j.WriteNumber("Id"u8, Id.Value.Id); + j.WriteString("Shape"u8, Shape.AsSpan); + if (ConnectorCondition is not ShapeConnectorCondition.None) + j.WriteString("ConnectorCondition"u8, ConnectorCondition.StringU8); + if (GenderRaceCondition is not GenderRace.Unknown) + j.WriteNumber("GenderRaceCondition"u8, (uint)GenderRaceCondition); + return j; + } + public static ShpIdentifier? FromJson(JObject jObj) { var shape = jObj["Shape"]?.ToObject(); diff --git a/Penumbra/Mods/DebugUtilities.cs b/Penumbra/Mods/DebugUtilities.cs new file mode 100644 index 000000000..42f0d4675 --- /dev/null +++ b/Penumbra/Mods/DebugUtilities.cs @@ -0,0 +1,249 @@ +using System.Text.Json; +using Luna; +using Penumbra.Files; +using Penumbra.Mods.Groups; +using Penumbra.Mods.Manager; +using Penumbra.Mods.SubMods; +using Penumbra.Util; +using static Penumbra.Files.ModDeserialization; + +namespace Penumbra.Mods; + +public static class DebugUtilities +{ + public static void CompareModSerDeser(ModManager mods) + { + foreach (var mod in mods) + { + var testMod = new Mod(mod.ModPath); + + try + { + ReloadMod(mods.DataEditor.SaveService, testMod); + var equal = CompareMod(mod, testMod, false); + if (!equal) + { + Penumbra.Log.Information($"[ModTest] Failure Failure {mod.Name}"); + // Only for debugging purposes check again to step through on failures only. + equal = CompareMod(mod, testMod, false); + } + else + { + try + { + using var ms = new MemoryStream(); + using (var j = new Utf8JsonWriter(ms, JsonFunctions.WriterOptions)) + { + ModSerialization.WriteMod(j, mod); + } + + var text = ms.ToArray(); + var reader = new Utf8JsonReader(text); + var writtenMod = new Mod(mod.ModPath); + var context = new Context(writtenMod); + ModMetaData.Read(ref reader, "memory", context); + var writtenEqual = CompareMod(mod, writtenMod, false); + if (writtenEqual) + { + Penumbra.Log.Debug($"[ModTest] Success Success {mod.Name}"); + } + else + { + Penumbra.Log.Information($"[ModTest] Success Failure {mod.Name}"); + File.WriteAllBytes(Path.Combine(mod.ModPath.Parent!.FullName, mod.ModPath.Name + ".json"), text); + // Only for debugging purposes check again to step through on failures only. + writtenEqual = CompareMod(mod, writtenMod, false); + } + } + catch (Exception ex) + { + Penumbra.Log.Information($"[ModTest] Success Failure {mod.Name} {ex.GetType().Name}"); + } + } + } + catch (Exception ex) + { + Penumbra.Log.Information($"[ModTest] Failure Failure {mod.Name} {ex.GetType().Name}"); + } + } + } + + /// Compare two mods for exact equality in all their parsed properties. + public static bool CompareMod(Mod lhs, Mod rhs, bool checkLocal) + { + // Meta + // Do not check StableIdentifier due to NewGuid(). + if (lhs.Name != rhs.Name) + return false; + if (lhs.Author != rhs.Author) + return false; + if (lhs.Description != rhs.Description) + return false; + if (lhs.Version != rhs.Version) + return false; + if (lhs.Website != rhs.Website) + return false; + if (lhs.Image != rhs.Image) + return false; + if (!lhs.ModTags.SequenceEqual(rhs.ModTags)) + return false; + if (!lhs.DefaultPreferredItems.SetEquals(rhs.DefaultPreferredItems)) + return false; + if (lhs.RequiredFeatures != rhs.RequiredFeatures) + return false; + + // Local + if (checkLocal) + { + if (lhs.Path.Folder != rhs.Path.Folder) + return false; // Skip node because duplication. + if (lhs.ImportDate != rhs.ImportDate) + return false; + if (lhs.LastConfigEdit != rhs.LastConfigEdit) + return false; + if (lhs.IgnoreLastConfig != rhs.IgnoreLastConfig) + return false; + if (!lhs.LocalTags.SequenceEqual(rhs.LocalTags)) + return false; + if (lhs.Note != rhs.Note) + return false; + if (!lhs.PreferredChangedItems.SetEquals(rhs.PreferredChangedItems)) + return false; + if (lhs.Favorite != rhs.Favorite) + return false; + } + + // Data + if (!CheckContainer(lhs.Default, rhs.Default)) + return false; + + if (lhs.Groups.Count != rhs.Groups.Count) + return false; + + foreach (var (lGroup, rGroup) in lhs.Groups.Zip(rhs.Groups)) + { + if (!CheckGroup(lGroup, rGroup)) + return false; + } + + return true; + } + + private static bool CheckSubObject(IModObject lhs, IModObject rhs) + { + // Skipped ID because of NewGuid(). + if (lhs.Name != rhs.Name) + return false; + if (lhs.Description != rhs.Description) + return false; + if (lhs.Layout != rhs.Layout) + return false; + if (!EqualityComparer>.Default.Equals(lhs.Condition, rhs.Condition)) + return false; + + return true; + } + + private static bool CheckGroup(IModGroup lGroup, IModGroup rGroup) + { + if (lGroup.Type != rGroup.Type) + return false; + if (!CheckSubObject(lGroup, rGroup)) + return false; + + if (lGroup.DefaultSettings != rGroup.DefaultSettings) + return false; + if (lGroup.Image != rGroup.Image) + return false; + if (lGroup.Page != rGroup.Page) + return false; + if (lGroup.Priority != rGroup.Priority) + return false; + if (lGroup.DefaultSettings != rGroup.DefaultSettings) + return false; + if (lGroup.ParentSetting != rGroup.ParentSetting) + return false; + + if (lGroup is ImcModGroup l) + { + if (rGroup is not ImcModGroup r) + return false; + + if (l.AllVariants != r.AllVariants) + return false; + if (l.CanBeDisabled != r.CanBeDisabled) + return false; + if (l.OnlyAttributes != r.OnlyAttributes) + return false; + if (!l.Identifier.Equals(r.Identifier)) + return false; + if (!l.DefaultEntry.Equals(r.DefaultEntry)) + return false; + } + + if (lGroup.Options.Count != rGroup.Options.Count) + return false; + if (lGroup.DataContainers.Count != rGroup.DataContainers.Count) + return false; + + foreach (var (lOption, rOption) in lGroup.Options.Zip(rGroup.Options)) + { + if (!CheckOption(lOption, rOption)) + return false; + } + + foreach (var (lContainer, rContainer) in lGroup.DataContainers.Zip(rGroup.DataContainers)) + { + if (!CheckContainer(lContainer, rContainer)) + return false; + } + + return true; + } + + private static bool CheckOption(IModOption lhs, IModOption rhs) + { + if (!CheckSubObject(lhs, rhs)) + return false; + + switch (lhs, rhs) + { + case (MultiSubMod l, MultiSubMod r): return l.Priority == r.Priority; + case (ImcSubMod l, ImcSubMod r): + if (l.IsDisableSubMod != r.IsDisableSubMod) + return false; + + return l.AttributeMask == r.AttributeMask; + } + + return true; + } + + private static bool CheckContainer(IModDataContainer lhs, IModDataContainer rhs) + { + if (!lhs.Files.SetEquals(rhs.Files)) + { + foreach (var key in rhs.Files.Keys) + { + if (!lhs.Files.TryGetValue(key, out var path)) + return false; + } + return false; + } + + if (!lhs.FileSwaps.SetEquals(rhs.FileSwaps)) + return false; + if (!lhs.Manipulations.Equals(rhs.Manipulations)) + return false; + + if (lhs is CombinedDataContainer l) + { + if (rhs is not CombinedDataContainer r) + return false; + + return l.Name == r.Name; + } + + return true; + } +} diff --git a/Penumbra/Mods/Editor/ModMerger.cs b/Penumbra/Mods/Editor/ModMerger.cs index 1b5f10343..67cb472cd 100644 --- a/Penumbra/Mods/Editor/ModMerger.cs +++ b/Penumbra/Mods/Editor/ModMerger.cs @@ -95,14 +95,14 @@ private void MergeWithOptions() case GroupType.Single: case GroupType.Multi: { - var (group, groupIdx, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, originalGroup.Type, originalGroup.Name); + var (group, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, originalGroup.Type, originalGroup.Name); if (group is null) throw new Exception( $"The merged group {originalGroup.Name} already existed, but had a different type than the original group of type {originalGroup.Type}."); if (groupCreated) { - _createdGroups.Add(groupIdx); + _createdGroups.Add(group.Index); group.Description = originalGroup.Description; group.Image = originalGroup.Image; group.DefaultSettings = originalGroup.DefaultSettings; @@ -112,7 +112,7 @@ private void MergeWithOptions() foreach (var originalOption in originalGroup.Options) { - var (option, _, optionCreated) = _groupEditor.FindOrAddOption(group, originalOption.Name); + var (option, optionCreated) = _groupEditor.FindOrAddOption(group, originalOption.Name); if (optionCreated) { _createdOptions.Add(option!); @@ -220,10 +220,10 @@ private void MergeIntoOption(string groupName, string optionName) return; } - var (group, groupIdx, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName, SaveType.None); + var (group, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName, SaveType.None); if (groupCreated) - _createdGroups.Add(groupIdx); - var (option, _, optionCreated) = _groupEditor.FindOrAddOption(group!, optionName, SaveType.None); + _createdGroups.Add(group!.Index); + var (option, optionCreated) = _groupEditor.FindOrAddOption(group!, optionName, SaveType.None); if (optionCreated) _createdOptions.Add(option!); var dir = ModCreator.NewOptionDirectory(MergeToMod!.ModPath, groupName, _config.ReplaceNonAsciiOnImport); @@ -362,8 +362,8 @@ public void SplitIntoMod(string modName) } else { - var (group, _, _) = _groupEditor.FindOrAddModGroup(result, originalGroup.Type, originalGroup.Name); - var (option, _, _) = _groupEditor.FindOrAddOption(group!, originalOption.GetName()); + var (group, _) = _groupEditor.FindOrAddModGroup(result, originalGroup.Type, originalGroup.Name); + var (option, _) = _groupEditor.FindOrAddOption(group!, originalOption.GetName()); var folder = Path.Combine(dir.FullName, group!.Name, option!.Name); var files = CopySubModFiles(originalOption, new DirectoryInfo(folder)); _groupEditor.SetFiles((IModDataContainer)option, files, SaveType.None); diff --git a/Penumbra/Mods/Groups/CombiningModGroup.cs b/Penumbra/Mods/Groups/CombiningModGroup.cs index ac71a0cf2..ac34bd978 100644 --- a/Penumbra/Mods/Groups/CombiningModGroup.cs +++ b/Penumbra/Mods/Groups/CombiningModGroup.cs @@ -22,18 +22,24 @@ public GroupType Type public GroupDrawBehaviour Behaviour => GroupDrawBehaviour.MultiSelection; - public Mod Mod { get; } - public string Name { get; set; } = "Group"; - public string Description { get; set; } = string.Empty; - public string Image { get; set; } = string.Empty; - public ModPriority Priority { get; set; } - public int Page { get; set; } - public Setting DefaultSettings { get; set; } - public ModSettingsLayout Layout { get; set; } - public ParentSetting ParentSetting { get; set; } = ParentSetting.None; - public ICondition? Condition { get; set; } - public readonly List OptionData = []; - public List Data { get; private set; } + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + + public Mod Mod { get; } + public Guid Id { get; set; } = Guid.NewGuid(); + public string Name { get; set; } = "Group"; + public string Description { get; set; } = string.Empty; + public string Image { get; set; } = string.Empty; + public ModPriority Priority { get; set; } + public int Page { get; set; } + public Setting DefaultSettings { get; set; } + public ModSettingsLayout Layout { get; set; } + public IModObject? ParentSetting { get; set; } + public ICondition? Condition { get; set; } + public readonly IndexList OptionData = []; + public IndexList Data { get; private set; } /// Groups that allow all available options to be selected at once. public CombiningModGroup(Mod mod) @@ -62,10 +68,6 @@ public bool IsOption public IModOption? AddOption(string name, string description = "") { - var groupIdx = Mod.Groups.IndexOf(this); - if (groupIdx < 0) - return null; - var subMod = new CombiningSubMod(this) { Name = name, @@ -83,7 +85,7 @@ public bool IsOption return null; var options = json["Options"]; - if (options != null) + if (options is not null) foreach (var child in options.Children()) { if (ret.OptionData.Count == IModGroup.MaxCombiningOptions) @@ -100,7 +102,7 @@ public bool IsOption var requiredContainers = 1 << ret.OptionData.Count; var containers = json["Containers"]; - if (containers != null) + if (containers is not null) foreach (var child in containers.Children()) { if (requiredContainers <= ret.Data.Count) @@ -121,7 +123,8 @@ public bool IsOption $"Combining Group {ret.Name} in {mod.Name} has not enough data containers for its {ret.OptionData.Count} options, filling with empty containers.", NotificationType.Warning); ret.Data.EnsureCapacity(requiredContainers); - ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count).Select(_ => new CombinedDataContainer(ret))); + ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count) + .Select(_ => new CombinedDataContainer(ret))); } ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings); @@ -129,9 +132,6 @@ public bool IsOption return ret; } - public int GetIndex() - => ModGroup.GetIndex(this); - public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer) => new CombiningModGroupEditDrawer(editDrawer, this); @@ -210,6 +210,9 @@ internal static CombiningModGroup WithoutMod(string name) }; /// For loading when no empty container should be created. + internal static CombiningModGroup EmptyData(Mod mod) + => new(mod, false); + private CombiningModGroup(Mod mod, bool _) { Mod = mod; diff --git a/Penumbra/Mods/Groups/IModGroup.cs b/Penumbra/Mods/Groups/IModGroup.cs index 95ddc54fd..40f9e4440 100644 --- a/Penumbra/Mods/Groups/IModGroup.cs +++ b/Penumbra/Mods/Groups/IModGroup.cs @@ -21,37 +21,13 @@ public enum GroupDrawBehaviour MultiSelection, } -public readonly struct ParentSetting -{ - public readonly string? Group; - public readonly string? Option; - - public static readonly ParentSetting None = new(null); - - public bool IsNone - => Group is null; - - public ParentSetting(string? group = null) - { - Group = group; - Option = null; - } - - public ParentSetting(string group, string? option = null) - { - Group = group; - Option = option; - } -} - -public interface IModGroup +public interface IModGroup : IModObject, IIndexed { public const int MaxMultiOptions = 32; public const int MaxCombiningOptions = 8; - public Mod Mod { get; } - public string Name { get; set; } - public string Description { get; set; } + IModGroup IModObject.Group + => this; /// Unused in Penumbra but for better TexTools interop. public string Image { get; set; } @@ -65,9 +41,13 @@ public interface IModGroup public Setting DefaultSettings { get; set; } - public ModSettingsLayout Layout { get; set; } - public ParentSetting ParentSetting { get; set; } - public ICondition? Condition { get; set; } + public IModObject? ParentSetting { get; set; } + + IModObject? CycleChecker.IHasParent.Parent + => ParentSetting; + + bool CycleChecker.IHasParent.CausesCycle(IModObject parent) + => ReferenceEquals(this, parent.Group); public FullPath? FindBestMatch(Utf8GamePath gamePath); public IModOption? AddOption(string name, string description = ""); @@ -76,8 +56,6 @@ public interface IModGroup public IReadOnlyList DataContainers { get; } public bool IsOption { get; } - public int GetIndex(); - public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer); public void AddData(ModSettings settings, Setting setting, Dictionary redirections, MetaDictionary manipulations); diff --git a/Penumbra/Mods/Groups/ImcModGroup.cs b/Penumbra/Mods/Groups/ImcModGroup.cs index acc188db0..30ffc3aef 100644 --- a/Penumbra/Mods/Groups/ImcModGroup.cs +++ b/Penumbra/Mods/Groups/ImcModGroup.cs @@ -16,7 +16,13 @@ namespace Penumbra.Mods.Groups; public class ImcModGroup(Mod mod) : IModGroup { + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public Mod Mod { get; } = mod; + public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = "Option"; public string Description { get; set; } = string.Empty; public string Image { get; set; } = string.Empty; @@ -31,7 +37,7 @@ public GroupDrawBehaviour Behaviour public int Page { get; set; } public Setting DefaultSettings { get; set; } = Setting.Zero; public ModSettingsLayout Layout { get; set; } - public ParentSetting ParentSetting { get; set; } = ParentSetting.None; + public IModObject? ParentSetting { get; set; } public ICondition? Condition { get; set; } public ImcIdentifier Identifier; @@ -64,12 +70,8 @@ public bool CanBeDisabled } } - public IModOption? AddOption(string name, string description = "") + public IModOption AddOption(string name, string description = "") { - var groupIdx = Mod.Groups.IndexOf(this); - if (groupIdx < 0) - return null; - var subMod = new ImcSubMod(this) { Name = name, @@ -80,7 +82,7 @@ public bool CanBeDisabled return subMod; } - public readonly List OptionData = []; + public readonly IndexList OptionData = []; public IReadOnlyList Options => OptionData; @@ -122,7 +124,7 @@ public void AddData(ModSettings settings, Setting setting, Dictionary m.IsDisableSubMod); if (idx >= 0) { - if (OptionData[idx].Condition is not {} condition || condition.Evaluate(context)) + if (OptionData[idx].Condition is not { } condition || condition.Evaluate(context)) return setting.HasFlag(idx); return false; @@ -258,7 +259,7 @@ private ushort GetCurrentMask(in ModSettingContext context, Setting setting) continue; var option = OptionData[i]; - if(option.Condition is null || option.Condition.Evaluate(context)) + if (option.Condition is null || option.Condition.Evaluate(context)) mask ^= option.AttributeMask; } diff --git a/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs b/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs index fbc85ec3d..05201a9c0 100644 --- a/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs +++ b/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs @@ -1,55 +1,94 @@ using ImSharp; +using ImSharp.ImNodes; using Luna; +using Penumbra.Communication; +using Penumbra.Services; +using Penumbra.UI.ModsTab; namespace Penumbra.Mods.Groups; -public sealed class ModGroupConditionDrawer : ConditionDrawer, IUiService +public sealed class ModGroupConditionCache : ConditionDrawerCache { - private string _group = string.Empty; - private string _option = string.Empty; + private readonly CommunicatorService _communicator; + private readonly ConditionCombo _conditionCombo = new() { Flags = ComboFlags.NoArrowButton }; - protected override bool DrawCustom(ICondition? condition, ModSettingContext context, - out ICondition? replaced) + public ModGroupConditionCache(CommunicatorService communicator, ModSettingContext context) + : base(context) { - var ret = false; - replaced = null; - switch (condition) + _communicator = communicator; + _communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.LayoutManager); + } + + protected override void Dispose(bool disposing) + { + _communicator.ModOptionChanged.Unsubscribe(OnModOptionChange); + } + + private void OnModOptionChange(in ModOptionChanged.Arguments arguments) + { + if (arguments.Mod != Context.Mod) + return; + + Dirty |= IManagedCache.DirtyFlags.Custom; + } + + protected override ICondition? CreateNewCondition() + { + var option = Context.Mod.Groups.Where(g => g != Context.Object?.Group).SelectMany(g => g.Options).FirstOrDefault(); + return option is null ? null : new SettingCondition(option); + } + + protected override CustomNode? HandleCustomCondition(Action?> setter, + ICondition condition, ParentConditionType parent, byte depth) + { + if (condition is not SettingCondition setting) + return null; + + var node = new SettingNode(IdCounter++, setting, setter, IdCounter++, parent, depth); + var ownSize = node.GetOwnSize(this); + AddNode(node, ownSize.X, false); + node.SubtreeHeight = ownSize.Y; + return node; + } + + private sealed class SettingNode( + NodeId id, + SettingCondition condition, + Action?> setter, + AttributeId output, + ParentConditionType parent, + byte depth) : CustomNode(id, condition, setter, output, parent, depth) + { + public override Vector2 GetOwnSize(ConditionDrawerCache drawerCache) + => drawerCache.ConstantNodeSize with { X = drawerCache.ButtonSize.X * 10 }; + + /// + public override Rgba32 TitleColor(ConditionDrawerCache drawerCache) + => Rgba32.Transparent; + + /// + public override Rgba32 BorderColor(ConditionDrawerCache drawerCache) + => drawerCache.NodeColors.CustomBorder; + + public override bool DrawContent(ConditionDrawerCache drawerCache, ImSharp.ImNodes.Node node) { - case null: + var actualSize = GetActualSize(drawerCache); + DrawOutputConnector(node, actualSize, Output); + var ret = false; + + var combo = ((ModGroupConditionCache)drawerCache)._conditionCombo; + using (node.TitleBar()) { - if (ImEx.Icon.Button(LunaStyle.AddObjectIcon, "Add a new condition."u8, _group.Length is 0 && _option.Length is 0)) + if (combo.Draw("##combo"u8, drawerCache.Context.Object!, actualSize.X, condition, out var newCondition)) { - replaced = new SingleSettingCondition(_group, _option); - _group = string.Empty; - _option = string.Empty; - ret = true; + Setter(newCondition); + ret = true; } - - Im.Line.SameInner(); - Im.Item.SetNextWidth(Im.ContentRegion.Available.X * 0.4f); - Im.Input.Text("##Group"u8, ref _group, "Group..."u8); - Im.Line.SameInner(); - Im.Item.SetNextWidth(Im.ContentRegion.Available.X); - Im.Input.Text("##Options"u8, ref _option, "Options..."u8); - } - break; - case SingleSettingCondition single: - { - Im.FrameDummy(); - Im.Line.SameInner(); - ImEx.TextFramed(single.Group, new Vector2(Im.ContentRegion.Available.X * 0.4f, 0)); - Im.Line.SameInner(); - ImEx.TextFramed(single.Option, Im.ContentRegion.Available with { Y = 0 }); } - break; - case MultiSettingAllCondition all: - { } - break; - case MultiSettingAnyCondition any: - { } - break; - } - return ret; + var buttonSize = new Vector2(MathF.Round(actualSize.X / (Parent is ParentConditionType.Not ? 3 : 4)), drawerCache.ButtonSize.Y - ImNodes.Style.NodeBorderThickness); + Im.Cursor.X += ImNodes.Style.NodeBorderThickness; + return ret | DefaultButtons(drawerCache, node, buttonSize); + } } } diff --git a/Penumbra/Mods/Groups/ModGroupConditionParser.cs b/Penumbra/Mods/Groups/ModGroupConditionParser.cs index 43d70405a..ae0b80212 100644 --- a/Penumbra/Mods/Groups/ModGroupConditionParser.cs +++ b/Penumbra/Mods/Groups/ModGroupConditionParser.cs @@ -4,67 +4,3 @@ namespace Penumbra.Mods.Groups; -public sealed class ModGroupConditionParser : ConditionParser, IService -{ - protected override ICondition? ParseCustomType(ref Utf8JsonReader reader, Utf8JsonObjectReader obj, StringU8 type) - { - if (type.Equals("SingleSetting"u8)) - { - var group = string.Empty; - var option = string.Empty; - while (obj.Read(ref reader)) - { - if (reader.TokenType is not JsonTokenType.PropertyName) - continue; - - if (reader.CheckPropertyValue("Group"u8, JsonTokenType.String)) - reader.TryReadString(out group!); - else if (reader.CheckPropertyValue("Option"u8, JsonTokenType.String)) - reader.TryReadString(out option!); - } - - if (group.Length is 0 || option.Length is 0) - return null; - - return new SingleSettingCondition(group, option); - } - - if (type.Equals("MultiSettingAll"u8)) - { - var (group, options) = GetMulti(obj, ref reader); - if (group.Length is 0 || options is null) - return null; - - return new MultiSettingAllCondition(group, options); - } - - if (type.Equals("MultiSettingAny"u8)) - { - var (group, options) = GetMulti(obj, ref reader); - if (group.Length is 0 || options is null) - return null; - - return new MultiSettingAnyCondition(group, options); - } - - return null; - - static (string, string[]?) GetMulti(Utf8JsonObjectReader obj, ref Utf8JsonReader reader) - { - var group = string.Empty; - List? options = null; - while (obj.Read(ref reader)) - { - if (reader.TokenType is not JsonTokenType.PropertyName) - continue; - - if (reader.CheckPropertyValue("Group"u8, JsonTokenType.String)) - reader.TryReadString(out group!); - else if (reader.CheckPropertyValue("Options"u8)) - options = reader.ReadStringArray(); - } - - return (group, options?.OfType().ToArray()); - } - } -} diff --git a/Penumbra/Mods/Groups/ModGroupEditUpdater.cs b/Penumbra/Mods/Groups/ModGroupEditUpdater.cs deleted file mode 100644 index 5e66f6215..000000000 --- a/Penumbra/Mods/Groups/ModGroupEditUpdater.cs +++ /dev/null @@ -1,109 +0,0 @@ -using Luna; -using Penumbra.Communication; -using Penumbra.Mods.Manager.OptionEditor; -using Penumbra.Services; - -namespace Penumbra.Mods.Groups; - -public sealed class ModGroupEditUpdater : IRequiredService, IDisposable -{ - private readonly CommunicatorService _communicator; - - public ModGroupEditUpdater(CommunicatorService communicator) - { - _communicator = communicator; - _communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.ModGroupEditUpdater); - } - - private static void OnModOptionChange(in ModOptionChanged.Arguments arguments) - { - switch (arguments.Type) - { - case ModOptionChangeType.GroupRenamed: - foreach (var group in arguments.Mod.Groups) - { - if (group.ParentSetting.Group == arguments.OldName) - group.ParentSetting = new ParentSetting(arguments.Group!.Name, group.ParentSetting.Option); - - Fix(group.Condition, arguments.OldName!, arguments.Group!.Name, true); - foreach (var option in group.Options) - Fix(option.Condition, arguments.OldName!, arguments.Group!.Name, true); - } - - break; - case ModOptionChangeType.OptionRenamed: - foreach (var group in arguments.Mod.Groups) - { - if (group.ParentSetting.Option == arguments.OldName) - group.ParentSetting = new ParentSetting(group.ParentSetting.Group!, arguments.Option!.Name); - - Fix(group.Condition, arguments.OldName!, arguments.Option!.Name, false); - foreach (var option in group.Options) - Fix(option.Condition, arguments.OldName!, arguments.Option!.Name, false); - } - - break; - case ModOptionChangeType.PrepareGroupDeletion: - foreach (var group in arguments.Mod.Groups) - { - if (group.ParentSetting.Group == arguments.Group!.Name) - group.ParentSetting = ParentSetting.None; - } - - break; - case ModOptionChangeType.OptionDeleted: - foreach (var group in arguments.Mod.Groups) - { - if (group.ParentSetting.Option == arguments.OldName) - group.ParentSetting = new ParentSetting(group.ParentSetting.Group); - } - - break; - } - } - - private static void Fix(ICondition? condition, string oldText, string newText, bool group) - { - switch (condition) - { - case MultiSettingCondition all when group: - if (all.Group == oldText) - all.Group = newText; - break; - case MultiSettingCondition all: - for (var i = 0; i < all.Count; ++i) - { - if (all[i] == oldText) - all[i] = newText; - } - - break; - case SingleSettingCondition single when group: - if (single.Group == oldText) - single.Group = newText; - break; - case SingleSettingCondition single: - if (single.Option == oldText) - single.Option = newText; - break; - } - } - - private static IEnumerable> GetAllConditions(Mod mod) - { - foreach (var group in mod.Groups) - { - if (group.Condition is not null) - yield return group.Condition; - - foreach (var option in group.Options) - { - if (option.Condition is not null) - yield return option.Condition; - } - } - } - - public void Dispose() - => _communicator.ModOptionChanged.Unsubscribe(OnModOptionChange); -} diff --git a/Penumbra/Mods/Groups/ModSaveGroup.cs b/Penumbra/Mods/Groups/ModSaveGroup.cs index 0b4134469..8da851341 100644 --- a/Penumbra/Mods/Groups/ModSaveGroup.cs +++ b/Penumbra/Mods/Groups/ModSaveGroup.cs @@ -3,7 +3,6 @@ using Penumbra.Files; using Penumbra.Mods.Settings; using Penumbra.Mods.SubMods; -using Penumbra.Services; namespace Penumbra.Mods.Groups; @@ -29,7 +28,7 @@ public static ModSaveGroup WithoutMod(DirectoryInfo basePath, IModGroup group, i => new(basePath, group, groupIndex, onlyAscii); public ModSaveGroup(IModGroup group, bool onlyAscii) - : this(group.Mod.ModPath, group, group.GetIndex(), onlyAscii) + : this(group.Mod.ModPath, group, group.Index, onlyAscii) { } public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii) @@ -53,7 +52,7 @@ public ModSaveGroup(DirectoryInfo basePath, IModDataContainer container, bool on else { _group = container.Group!; - _groupIdx = _group.GetIndex(); + _groupIdx = _group.Index; } } @@ -64,7 +63,7 @@ public ModSaveGroup(IModDataContainer container, bool onlyAscii) _defaultMod = container as DefaultSubMod; _onlyAscii = onlyAscii; _group = container.Group; - _groupIdx = _group?.GetIndex() ?? -1; + _groupIdx = _group?.Index ?? -1; } public string ToFilePath(FilenameService fileNames) @@ -73,7 +72,7 @@ public string ToFilePath(FilenameService fileNames) public void Save(Stream stream) { // TODO: System.Text.Json - using var w = new StreamWriter(stream); + using var w = new StreamWriter(stream, leaveOpen: true); using var j = new JsonTextWriter(w); j.Formatting = Formatting.Indented; var serializer = new JsonSerializer { Formatting = Formatting.Indented }; diff --git a/Penumbra/Mods/Groups/ModSettingContext.cs b/Penumbra/Mods/Groups/ModSettingContext.cs index 83da17072..c3801cf68 100644 --- a/Penumbra/Mods/Groups/ModSettingContext.cs +++ b/Penumbra/Mods/Groups/ModSettingContext.cs @@ -1,103 +1,50 @@ using System.Text.Json; +using ImSharp; using Luna; -using Penumbra.Api.Enums; using Penumbra.Mods.Settings; +using Penumbra.Mods.SubMods; namespace Penumbra.Mods.Groups; -public readonly record struct ModSettingContext(Mod Mod, ModSettings Settings); - -public sealed class MultiSettingAllCondition(string group, params IReadOnlyCollection options) : MultiSettingCondition(group, options) +public readonly record struct ModSettingContext(Mod Mod, ModSettings Settings, IModObject? Object = null) : IConditionContext { - protected override ReadOnlySpan Type - => "MultiSettingAll"u8; - - public override ICondition DeepCopy() - => new MultiSettingAllCondition(Group, this); - - protected override bool EvaluateGroup(IModGroup group, Setting settings) + public static ICondition? ParseCustomType(ref Utf8JsonReader reader, Utf8JsonObjectLimit obj, StringU8 type) { - var matches = 0; - foreach (var option in this) + if (!type.Equals("Setting"u8)) + return null; + + var guid = Guid.Empty; + while (obj.Read(ref reader)) { - var optionIndex = group.Options.IndexOf(o => o.Name == option); - if (optionIndex < 0) - break; - - if (group.Type is GroupType.Single) - { - if (optionIndex == settings.AsIndex) - ++matches; - } - else if (settings.HasFlag(optionIndex)) - { - ++matches; - } - } + if (reader.TokenType is not JsonTokenType.PropertyName) + return null; - return matches == Count; - } -} + if (!reader.GuidProperty("Setting"u8, out guid)) + reader.Skip(); + } -public sealed class MultiSettingAnyCondition(string group, params IReadOnlyCollection options) : MultiSettingCondition(group, options) -{ - protected override ReadOnlySpan Type - => "MultiSettingAny"u8; + if (guid == Guid.Empty) + return null; - public override ICondition DeepCopy() - => new MultiSettingAnyCondition(Group, this); + return new SettingIdCondition(guid); + } - protected override bool EvaluateGroup(IModGroup group, Setting settings) - { - foreach (var option in this) - { - var optionIndex = group.Options.IndexOf(o => o.Name == option); - if (optionIndex < 0) - break; - - if (group.Type is GroupType.Single) - { - if (optionIndex == settings.AsIndex) - return true; - } - else if (settings.HasFlag(optionIndex)) - { - return true; - } - } + public ICondition? GetRoot() + => Object?.Condition; - return false; - } + public void SetRoot(ICondition? condition) + => Object?.Condition = condition?.Reduce(); } -public sealed class SingleSettingCondition(string group, string option) : ICondition +public sealed class SettingCondition(IModOption option) : ICondition { - public string Group = group; - public string Option = option; - - public bool Evaluate(in ModSettingContext context) - { - foreach (var (index, group) in context.Mod.Groups.Index()) - { - if (group.Name != Group) - continue; - - var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index]; - var option = group.Options.IndexOf(o => o.Name == Option); - if (option < 0) - continue; - - switch (group.Type) - { - case GroupType.Single when option == settings.AsIndex: - case GroupType.Multi when settings.HasFlag(option): - return true; - } - } + public IModOption Option { get; set; } = option; - return false; - } + public bool Equals(ICondition? other) + => other is SettingCondition s && Option == s.Option; + public bool Evaluate(in ModSettingContext context) + => Option.IsEnabled(context.Settings); public ICondition Reduce() => this; @@ -105,80 +52,55 @@ public ICondition Reduce() public void WriteJson(Utf8JsonWriter j) { j.WriteStartObject(); - j.WriteString("Type"u8, "SingleSetting"u8); - j.WriteString("Group"u8, Group); - j.WriteString("Option"u8, Option); + j.WriteString("Type"u8, "Setting"u8); + j.WriteString("Setting"u8, Option.Id); j.WriteEndObject(); } - /// public ICondition DeepCopy() - => new SingleSettingCondition(Group, Option); + => new SettingCondition(Option); public IEnumerable> Subconditions => []; public int RemoveSubconditions(Func, bool> predicate) => 0; + + public ICondition? EditConditions(Func, ICondition?> method) + => method(this); } -public abstract class MultiSettingCondition(string group) : List, ICondition +public sealed class SettingIdCondition(Guid id) : ICondition { - protected MultiSettingCondition(string group, IReadOnlyCollection options) - : this(group) - { - EnsureCapacity(options.Count); - AddRange(options); - } - - public string Group = group; + public Guid Option { get; } = id; - public abstract ICondition DeepCopy(); - protected abstract ReadOnlySpan Type { get; } - protected abstract bool EvaluateGroup(IModGroup group, Setting settings); + public bool Equals(ICondition? other) + => other is SettingIdCondition s && Option == s.Option; public bool Evaluate(in ModSettingContext context) - { - if (Count is 0) - return true; - - foreach (var (index, group) in context.Mod.Groups.Index()) - { - if (group.Name != Group) - continue; - - if (group.Type is GroupType.Single && Count > 1) - continue; - - var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index]; - if (EvaluateGroup(group, settings)) - return true; - } - - return false; - } + => throw new NotImplementedException( + $"{nameof(SettingIdCondition)} can not be evaluated and is only for parsing and subsequent conversion to {nameof(SettingCondition)}."); public ICondition Reduce() - { - this.RemoveDuplicates(); - return this; - } + => this; public void WriteJson(Utf8JsonWriter j) { j.WriteStartObject(); - j.WriteString("Type"u8, Type); - j.WriteString("Group"u8, Group); - j.WriteStartArray("Options"u8); - foreach (var option in this) - j.WriteStringValue(option); - j.WriteEndArray(); + j.WriteString("Type"u8, "Setting"u8); + j.WriteString("Setting"u8, Option); j.WriteEndObject(); } + public ICondition DeepCopy() + => new SettingIdCondition(Option); + public IEnumerable> Subconditions => []; public int RemoveSubconditions(Func, bool> predicate) => 0; + + public ICondition? EditConditions(Func, ICondition?> method) + => method(this); } diff --git a/Penumbra/Mods/Groups/MultiModGroup.cs b/Penumbra/Mods/Groups/MultiModGroup.cs index 00102ab55..cb2f4add6 100644 --- a/Penumbra/Mods/Groups/MultiModGroup.cs +++ b/Penumbra/Mods/Groups/MultiModGroup.cs @@ -14,7 +14,8 @@ namespace Penumbra.Mods.Groups; /// Groups that allow all available options to be selected at once. -public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup +public sealed class + MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup { public GroupType Type => GroupType.Multi; @@ -22,7 +23,13 @@ public GroupType Type public GroupDrawBehaviour Behaviour => GroupDrawBehaviour.MultiSelection; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public Mod Mod { get; } = mod; + public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = "Group"; public string Description { get; set; } = string.Empty; public string Image { get; set; } = string.Empty; @@ -30,9 +37,9 @@ public GroupDrawBehaviour Behaviour public int Page { get; set; } public Setting DefaultSettings { get; set; } public ModSettingsLayout Layout { get; set; } - public ParentSetting ParentSetting { get; set; } = ParentSetting.None; + public IModObject? ParentSetting { get; set; } public ICondition? Condition { get; set; } - public readonly List OptionData = []; + public readonly IndexList OptionData = []; public IReadOnlyList Options => OptionData; @@ -52,12 +59,8 @@ public bool IsOption return null; } - public IModOption? AddOption(string name, string description = "") + public IModOption AddOption(string name, string description = "") { - var groupIdx = Mod.Groups.IndexOf(this); - if (groupIdx < 0) - return null; - var subMod = new MultiSubMod(this) { Name = name, @@ -109,9 +112,6 @@ public SingleModGroup ConvertToSingle() return single; } - public int GetIndex() - => ModGroup.GetIndex(this); - public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer) => new MultiModGroupEditDrawer(editDrawer, this); diff --git a/Penumbra/Mods/Groups/SingleModGroup.cs b/Penumbra/Mods/Groups/SingleModGroup.cs index 67994bd7f..3d73b7371 100644 --- a/Penumbra/Mods/Groups/SingleModGroup.cs +++ b/Penumbra/Mods/Groups/SingleModGroup.cs @@ -21,7 +21,13 @@ public GroupType Type public GroupDrawBehaviour Behaviour => GroupDrawBehaviour.SingleSelection; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public Mod Mod { get; } = mod; + public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = "Option"; public string Description { get; set; } = string.Empty; public string Image { get; set; } = string.Empty; @@ -29,10 +35,10 @@ public GroupDrawBehaviour Behaviour public int Page { get; set; } public Setting DefaultSettings { get; set; } public ModSettingsLayout Layout { get; set; } - public ParentSetting ParentSetting { get; set; } = ParentSetting.None; + public IModObject? ParentSetting { get; set; } public ICondition? Condition { get; set; } - public readonly List OptionData = []; + public readonly IndexList OptionData = []; public FullPath? FindBestMatch(Utf8GamePath gamePath) { @@ -96,9 +102,6 @@ public MultiModGroup ConvertToMulti() return multi; } - public int GetIndex() - => ModGroup.GetIndex(this); - public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer) => new SingleModGroupEditDrawer(editDrawer, this); diff --git a/Penumbra/Mods/Manager/ModDataEditor.cs b/Penumbra/Mods/Manager/ModDataEditor.cs index 2dba04818..31999aae1 100644 --- a/Penumbra/Mods/Manager/ModDataEditor.cs +++ b/Penumbra/Mods/Manager/ModDataEditor.cs @@ -30,6 +30,8 @@ public enum ModDataChangeType : uint FileSystemFolder = 0x010000, FileSystemSortOrder = 0x020000, LastConfigEdit = 0x040000, + Identifier = 0x080000, + PageNames = 0x100000, } public class ModDataEditor(SaveService saveService, CommunicatorService communicatorService, ItemData itemData, LocalModDatabase database) @@ -113,6 +115,17 @@ public void ChangeRequiredFeatures(Mod mod, FeatureFlags flags) communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.RequiredFeatures, mod, null)); } + public bool ForceIdentifier(Mod mod, Guid newGuid) + { + if (newGuid == Guid.Empty || mod.StableIdentifier == newGuid || mod.SubObjects.ContainsKey(newGuid)) + return false; + + mod.StableIdentifier = newGuid; + saveService.QueueSave(new ModMeta(mod)); + communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.Identifier, mod, null)); + return true; + } + public void ChangeModTag(Mod mod, int tagIdx, string newTag) => ChangeTag(mod, tagIdx, newTag, false); @@ -159,6 +172,27 @@ public void ChangeModNote(Mod mod, string newNote) communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.Favorite, mod, null)); } + public void ChangePageName(Mod mod, int page, string newName) + { + var oldName = string.Empty; + if (newName.Length is 0) + { + if (!mod.PageNames.Remove(page)) + return; + } + else if (mod.PageNames.TryGetValue(page, out oldName) && oldName == newName) + { + return; + } + else + { + mod.PageNames[page] = newName; + } + + saveService.QueueSave(new ModMeta(mod)); + communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.PageNames, mod, oldName ?? string.Empty)); + } + private void ChangeTag(Mod mod, int tagIdx, string newTag, bool local) { var which = local ? mod.LocalTags : mod.ModTags; diff --git a/Penumbra/Mods/Manager/ModImportManager.cs b/Penumbra/Mods/Manager/ModImportManager.cs index 006fb473d..13ad17308 100644 --- a/Penumbra/Mods/Manager/ModImportManager.cs +++ b/Penumbra/Mods/Manager/ModImportManager.cs @@ -16,7 +16,7 @@ public class ModImportManager( FileCompactor compactor) : IDisposable, IService { private readonly Dictionary _uniqueModsToUnpack = new(StringComparer.OrdinalIgnoreCase); - internal readonly Queue> ModsToUnpack = new(); + internal readonly Queue ModsToUnpack = new(); /// Mods need to be added thread-safely outside of iteration. private readonly ConcurrentQueue _modsToAdd = new(); @@ -31,14 +31,14 @@ public void TryUnpacking() if (Importing && _import!.State is not ImporterState.Done) return; - List newMods; + UnpackRequest newMods; lock (ModsToUnpack) { - if (!ModsToUnpack.TryDequeue(out newMods!)) + if (!ModsToUnpack.TryDequeue(out newMods)) return; } - var files = newMods.Where(s => + var files = newMods.Paths.Where(s => { if (File.Exists(s)) return true; @@ -50,10 +50,13 @@ public void TryUnpacking() Penumbra.Log.Debug($"Unpacking mods: {string.Join("\n\t", files.Select(f => f.FullName))}."); if (files.Length == 0) + { + newMods.TaskCompletionSource.SetResult([]); return; + } - _import = new TexToolsImporter(files.Length, files, AddNewMod, config, duplicates, modNormalizer, modManager, compactor, - migrationManager, _import); + _import = new TexToolsImporter(files.Length, files, AddNewMod, newMods.TaskCompletionSource, config, duplicates, modNormalizer, + modManager, compactor, migrationManager, _import); } public bool Importing @@ -65,10 +68,7 @@ public bool IsImporting([NotNullWhen(true)] out TexToolsImporter? importer) return _import != null; } - public void AddUnpack(IEnumerable paths) - => AddUnpack(paths.ToList()); - - public void AddUnpack(params List paths) + public Task AddUnpack(params List paths) { lock (ModsToUnpack) { @@ -95,9 +95,13 @@ public void AddUnpack(params List paths) if (paths.Count > 0) { Penumbra.Log.Debug($"Adding mods to install: {string.Join("\n\t", paths)}"); - ModsToUnpack.Enqueue(paths); + var tcs = new TaskCompletionSource(); + ModsToUnpack.Enqueue(new UnpackRequest(paths, tcs)); + return tcs.Task; } } + + return Task.FromResult(Array.Empty()); } public void ClearImport() @@ -156,4 +160,6 @@ private void AddNewMod(FileInfo file, DirectoryInfo? dir, Exception? error) _modsToAdd.Enqueue(dir); } } + + internal readonly record struct UnpackRequest(List Paths, TaskCompletionSource TaskCompletionSource); } diff --git a/Penumbra/Mods/Manager/ModImportResult.cs b/Penumbra/Mods/Manager/ModImportResult.cs new file mode 100644 index 000000000..5350544cb --- /dev/null +++ b/Penumbra/Mods/Manager/ModImportResult.cs @@ -0,0 +1,3 @@ +namespace Penumbra.Mods.Manager; + +public readonly record struct ModImportResult(FileInfo File, DirectoryInfo? Mod, Exception? Error); diff --git a/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs index f8d21a92e..b7682682a 100644 --- a/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs @@ -43,6 +43,6 @@ public void SetDisplayName(CombinedDataContainer container, string name, SaveTyp container.Name = name; SaveService.Save(saveType, new ModSaveGroup(container.Group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, container.Group.Mod, container.Group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, container.Group.Mod, container.Group, null, null, Guid.Empty, -1)); } } diff --git a/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs index 7f8adfc1a..a27cc478a 100644 --- a/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs @@ -20,11 +20,12 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ if (!ModGroupEditor.VerifyFileName(mod, null, newName, true)) return null; - var maxPriority = mod.Groups.Count == 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1; + var maxPriority = mod.Groups.Count is 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1; var group = CreateGroup(mod, newName, identifier, defaultEntry, maxPriority); mod.Groups.Add(group); SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, group.Id, + -1)); return group; } @@ -42,7 +43,8 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ }; group.OptionData.Add(subMod); SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, subMod, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, subMod, null, + subMod.Id, -1)); return subMod; } @@ -56,7 +58,8 @@ public void ChangeDefaultAttribute(ImcModGroup group, in ImcAttributeCache cache return; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, + group.Id, -1)); } public void ChangeDefaultEntry(ImcModGroup group, in ImcEntry newEntry, SaveType saveType = SaveType.Queue) @@ -67,7 +70,8 @@ public void ChangeDefaultEntry(ImcModGroup group, in ImcEntry newEntry, SaveType group.DefaultEntry = entry; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, + group.Id, -1)); } public void ChangeOptionAttribute(ImcSubMod option, in ImcAttributeCache cache, int idx, bool value, SaveType saveType = SaveType.Queue) @@ -76,7 +80,8 @@ public void ChangeOptionAttribute(ImcSubMod option, in ImcAttributeCache cache, return; SaveService.Save(saveType, new ModSaveGroup(option.Group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, option.Mod, option.Group, option, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, option.Mod, option.Group, + option, null, option.Id, -1)); } public void ChangeAllVariants(ImcModGroup group, bool allVariants, SaveType saveType = SaveType.Queue) @@ -86,7 +91,8 @@ public void ChangeAllVariants(ImcModGroup group, bool allVariants, SaveType save group.AllVariants = allVariants; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, + group.Id, -1)); } public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveType saveType = SaveType.Queue) @@ -96,7 +102,8 @@ public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveTyp group.OnlyAttributes = onlyAttributes; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, + group.Id, -1)); } public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType saveType = SaveType.Queue) @@ -106,7 +113,8 @@ public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType group.CanBeDisabled = canBeDisabled; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, + group.Id, -1)); } protected override ImcModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync) @@ -117,7 +125,8 @@ protected override ImcModGroup CreateGroup(Mod mod, string newName, ModPriority }; - private static ImcModGroup CreateGroup(Mod mod, string newName, ImcIdentifier identifier, ImcEntry defaultEntry, ModPriority priority, SaveType saveType = SaveType.ImmediateSync) + private static ImcModGroup CreateGroup(Mod mod, string newName, ImcIdentifier identifier, ImcEntry defaultEntry, ModPriority priority, + SaveType saveType = SaveType.ImmediateSync) => new(mod) { Name = newName, diff --git a/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs b/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs new file mode 100644 index 000000000..ee362be57 --- /dev/null +++ b/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs @@ -0,0 +1,104 @@ +using Luna; +using Penumbra.Communication; +using Penumbra.Files; +using Penumbra.Mods.Groups; +using Penumbra.Mods.SubMods; +using Penumbra.Services; + +namespace Penumbra.Mods.Manager.OptionEditor; + +public sealed class LayoutManager : IRequiredService, IDisposable +{ + public readonly SaveService SaveService; + public readonly CommunicatorService Communicator; + public readonly LunaLogger Log; + + public LayoutManager(SaveService saveService, CommunicatorService communicator, LunaLogger log) + { + SaveService = saveService; + Communicator = communicator; + Log = log; + + Communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.LayoutManager); + } + + public void Dispose() + { + Communicator.ModOptionChanged.Unsubscribe(OnModOptionChange); + } + + public static string? ValidateCondition(IModObject parent, IModOption option) + { + if (option == parent) + return $"The option {parent.Name} can not depend on itself."; + + if (option.Group == parent) + return $"The group {parent.Name} can not depend on an option {option.Name} of itself."; + + if (option.Group.Behaviour is GroupDrawBehaviour.SingleSelection && option.Group == parent.Group) + return $"The option {parent.Name} can not depend on another option {option.Name} in its own single group {parent.Group.Name}."; + + return null; + } + + + private void OnModOptionChange(in ModOptionChanged.Arguments arguments) + { + switch (arguments.Type) + { + case ModOptionChangeType.OptionDeleted: + { + if (arguments.Mod.SubObjects.Remove(arguments.Id, out var obj)) + foreach (var @object in arguments.Mod.SubObjects.Values) + RemoveObjectFromObject(@object, obj); + return; + } + case ModOptionChangeType.PrepareGroupDeletion: + { + var group = arguments.Group; + foreach (var option in group?.Options ?? []) + { + if (arguments.Mod.SubObjects.Remove(option.Id, out var obj)) + foreach (var @object in arguments.Mod.SubObjects.Values.Where(o => o.Group != group)) + RemoveObjectFromObject(@object, obj); + } + + return; + } + case ModOptionChangeType.GroupDeleted: + { + if (arguments.Mod.SubObjects.Remove(arguments.Id, out var obj)) + foreach (var @object in arguments.Mod.SubObjects.Values) + RemoveObjectFromObject(@object, obj); + return; + } + case ModOptionChangeType.OptionAdded when arguments.Option is { } option: + { + if (!arguments.Mod.SubObjects.TryAdd(option.Id, option)) + Log.Error($"Could not add option {option.Name} to {arguments.Mod.Name}'s sub objects: GUID {option.Id} already present."); + return; + } + case ModOptionChangeType.GroupAdded when arguments.Group is { } group: + { + foreach (var @object in group.Options.Prepend(group)) + { + if (!arguments.Mod.SubObjects.TryAdd(@object.Id, @object)) + Log.Error( + $"Could not add option {@object.Name} to {arguments.Mod.Name}'s sub objects: GUID {@object.Id} already present."); + } + + return; + } + } + } + + private static void RemoveObjectFromObject(IModObject @object, IModObject toRemove) + { + if (@object is IModGroup group && ReferenceEquals(group.ParentSetting, toRemove)) + group.ParentSetting = null; + @object.Condition?.RemoveSubconditions(c => c is SettingCondition s && s.Option == toRemove); + @object.Condition = @object.Condition?.Reduce(); + if (@object.Condition is TrueCondition) + @object.Condition = null; + } +} diff --git a/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs index be6ff416e..17ab6a23e 100644 --- a/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs @@ -19,6 +19,7 @@ public enum ModOptionChangeType GroupAdded, GroupDeleted, GroupMoved, + GroupIdentifierChanged, GroupTypeChanged, PriorityChanged, OptionRenamed, @@ -29,10 +30,12 @@ public enum ModOptionChangeType OptionFilesAdded, OptionSwapsChanged, OptionMetaChanged, + OptionIdentifierChanged, DisplayChange, PrepareChange, PrepareGroupDeletion, DefaultOptionChanged, + ConditionChanged, } public class ModGroupEditor( @@ -64,7 +67,8 @@ public void ChangeModGroupDefaultOption(IModGroup group, Setting defaultOption) group.DefaultSettings = defaultOption; saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DefaultOptionChanged, group.Mod, group, null, null, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DefaultOptionChanged, group.Mod, group, null, + null, group.Id, -1)); } /// Rename an option group if possible. @@ -76,32 +80,110 @@ public void RenameModGroup(IModGroup group, string newName) saveService.ImmediateDelete(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); group.Name = newName; - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupRenamed, group.Mod, group, null, null, oldName, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupRenamed, group.Mod, group, null, null, + group.Id, -1)); saveService.ImmediateSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); } /// Delete a given option group. Fires an event to prepare before actually deleting. public void DeleteModGroup(IModGroup group) { - var mod = group.Mod; - var idx = group.GetIndex(); - var oldName = group.Name; - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareGroupDeletion, mod, group, null, null, null, -1)); + var mod = group.Mod; + var idx = group.Index; + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareGroupDeletion, mod, group, null, null, + group.Id, -1)); mod.Groups.RemoveAt(idx); saveService.SaveAllOptionGroups(mod, false, config.ReplaceNonAsciiOnImport); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupDeleted, mod, null, null, null, oldName, idx)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupDeleted, mod, null, null, null, group.Id, + idx)); } /// Move the index of a given option group. public void MoveModGroup(IModGroup group, int groupIdxTo) { var mod = group.Mod; - var idxFrom = group.GetIndex(); + var idxFrom = group.Index; if (!mod.Groups.Move(ref idxFrom, ref groupIdxTo)) return; saveService.SaveAllOptionGroups(mod, false, config.ReplaceNonAsciiOnImport); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupMoved, mod, group, null, null, null, idxFrom)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupMoved, mod, group, null, null, group.Id, + idxFrom)); + } + + /// Force the GUID of an object to a specific value. Empty GUIDs are not allowed. + /// The object to edit. + /// The desired new GUID. + /// False if the new GUID is already used in this mod or if it is empty, true otherwise. + public bool ForceIdentifier(IModObject @object, Guid newGuid) + { + if (newGuid == Guid.Empty || @object.Mod.StableIdentifier == newGuid || @object.Mod.SubObjects.ContainsKey(newGuid)) + return false; + + var oldGuid = @object.Id; + @object.Id = newGuid; + saveService.SaveAllOptionGroups(@object.Mod, false, config.ReplaceNonAsciiOnImport); + var changeType = @object is IModGroup ? ModOptionChangeType.GroupIdentifierChanged : ModOptionChangeType.OptionIdentifierChanged; + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(changeType, @object.Mod, @object.Group, @object as IModOption, null, + oldGuid, -1)); + return true; + } + + public void SetCondition(IModObject @object, ICondition? condition, bool force) + { + if (!force && (condition?.Equals(@object.Condition) ?? @object.Condition is null)) + return; + + @object.Condition = condition; + saveService.QueueSave(new ModSaveGroup(@object.Group, config.ReplaceNonAsciiOnImport)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.ConditionChanged, @object.Mod, @object.Group, + @object as IModOption, null, @object.Id, -1)); + } + + public void SetPage(IModGroup group, int page) + { + if (group.Page == page) + return; + + group.Page = page; + saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group, + null, null, group.Id, -1)); + } + + public void SetParent(IModGroup group, IModObject? parent) + { + if (ReferenceEquals(group.ParentSetting, parent)) + return; + + group.ParentSetting = parent; + saveService.QueueSave(new ModSaveGroup(group.Group, config.ReplaceNonAsciiOnImport)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group.Group, null, + null, group.Id, -1)); + } + + public void SetLayout(IModObject @object, ModSettingsLayout layout) + { + layout = layout.Reduce(@object); + if (@object.Layout == layout) + return; + + @object.Layout = layout; + saveService.QueueSave(new ModSaveGroup(@object.Group, config.ReplaceNonAsciiOnImport)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, @object.Mod, @object.Group, + @object as IModOption, null, @object.Id, -1)); + } + + public void SetColor(IModOption option, int colorType) + { + var color = IModOption.ConvertColor(colorType); + if (color == option.Color) + return; + + option.Color = color; + saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group, + option, null, option.Id, -1)); } /// Change the internal priority of the given option group. @@ -112,7 +194,8 @@ public void ChangeGroupPriority(IModGroup group, ModPriority newPriority) group.Priority = newPriority; saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, group.Mod, group, null, null, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, group.Mod, group, null, null, + group.Id, -1)); } /// Change the description of the given option group. @@ -123,7 +206,8 @@ public void ChangeGroupDescription(IModGroup group, string newDescription) group.Description = newDescription; saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group, null, null, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group, null, null, + group.Id, -1)); } /// Rename the given option. @@ -135,7 +219,8 @@ public void RenameOption(IModOption option, string newName) option.Name = newName; saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionRenamed, option.Mod, option.Group, option, null, oldName, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionRenamed, option.Mod, option.Group, option, + null, option.Id, -1)); } /// Change the description of the given option. @@ -146,7 +231,8 @@ public void ChangeOptionDescription(IModOption option, string newDescription) option.Description = newDescription; saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group, option, null, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group, option, + null, option.Id, -1)); } /// Set the meta manipulations for a given option. Replaces existing manipulations. @@ -155,10 +241,12 @@ public void SetManipulations(IModDataContainer subMod, MetaDictionary manipulati if (subMod.Manipulations.Equals(manipulations)) return; - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, (Mod)subMod.Mod, subMod.Group, null, subMod, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, (Mod)subMod.Mod, subMod.Group, + null, subMod, Guid.Empty, -1)); subMod.Manipulations.SetTo(manipulations); saveService.Save(saveType, new ModSaveGroup(subMod, config.ReplaceNonAsciiOnImport)); - communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, (Mod)subMod.Mod, subMod.Group, null, subMod, null, -1)); + communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, (Mod)subMod.Mod, + subMod.Group, null, subMod, Guid.Empty, -1)); } /// Set the file redirections for a given option. Replaces existing redirections. @@ -167,10 +255,12 @@ public void SetFiles(IModDataContainer subMod, IReadOnlyDictionary Forces a file save of the given container's group. @@ -185,7 +275,8 @@ public void AddFiles(IModDataContainer subMod, IReadOnlyDictionary Verify that a new option group name is unique in this mod. @@ -267,24 +360,24 @@ public void DeleteOption(IModOption option) _ => null, }; - public (IModGroup?, int, bool) FindOrAddModGroup(Mod mod, GroupType type, string name, SaveType saveType = SaveType.ImmediateSync) + public (IModGroup?, bool) FindOrAddModGroup(Mod mod, GroupType type, string name, SaveType saveType = SaveType.ImmediateSync) => type switch { GroupType.Single => SingleEditor.FindOrAddModGroup(mod, name, saveType), GroupType.Multi => MultiEditor.FindOrAddModGroup(mod, name, saveType), GroupType.Imc => ImcEditor.FindOrAddModGroup(mod, name, saveType), GroupType.Combining => CombiningEditor.FindOrAddModGroup(mod, name, saveType), - _ => (null, -1, false), + _ => (null, false), }; - public (IModOption?, int, bool) FindOrAddOption(IModGroup group, string name, SaveType saveType = SaveType.ImmediateSync) + public (IModOption?, bool) FindOrAddOption(IModGroup group, string name, SaveType saveType = SaveType.ImmediateSync) => group switch { SingleModGroup s => SingleEditor.FindOrAddOption(s, name, saveType), MultiModGroup m => MultiEditor.FindOrAddOption(m, name, saveType), ImcModGroup i => ImcEditor.FindOrAddOption(i, name, saveType), CombiningModGroup c => CombiningEditor.FindOrAddOption(c, name, saveType), - _ => (null, -1, false), + _ => (null, false), }; public void MoveOption(IModOption option, int toIdx) diff --git a/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs index d4e57f3bb..7bb320b2a 100644 --- a/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs @@ -25,30 +25,30 @@ public abstract class ModOptionEditor( if (!ModGroupEditor.VerifyFileName(mod, null, newName, true)) return null; - var maxPriority = mod.Groups.Count == 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1; + var maxPriority = mod.Groups.Count is 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1; var group = CreateGroup(mod, newName, maxPriority); mod.Groups.Add(group); SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, group.Id, + -1)); return group; } /// Add a new mod, empty option group of the given type and name if it does not exist already. - public (TGroup, int, bool) FindOrAddModGroup(Mod mod, string newName, SaveType saveType = SaveType.ImmediateSync) + public (TGroup, bool) FindOrAddModGroup(Mod mod, string newName, SaveType saveType = SaveType.ImmediateSync) { var idx = mod.Groups.IndexOf(g => g.Name == newName); if (idx >= 0) { var existingGroup = mod.Groups[idx] as TGroup ?? throw new Exception($"Mod group with name {newName} exists, but is of the wrong type."); - return (existingGroup, idx, false); + return (existingGroup, false); } - idx = mod.Groups.Count; if (AddModGroup(mod, newName, saveType) is not { } group) throw new Exception($"Could not create new mod group with name {newName}."); - return (group, idx, true); + return (group, true); } /// Add a new empty option of the given name for the given group. @@ -58,25 +58,26 @@ public abstract class ModOptionEditor( return null; SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, option, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, option, null, + option.Id, -1)); return option; } /// Add a new empty option of the given name for the given group if it does not exist already. - public (TOption, int, bool) FindOrAddOption(TGroup group, string newName, SaveType saveType = SaveType.Queue) + public (TOption, bool) FindOrAddOption(TGroup group, string newName, SaveType saveType = SaveType.Queue) { var idx = group.Options.IndexOf(o => o.Name == newName); if (idx >= 0) { var existingOption = group.Options[idx] as TOption ?? throw new Exception($"Mod option with name {newName} exists, but is of the wrong type."); // Should never happen. - return (existingOption, idx, false); + return (existingOption, false); } if (AddOption(group, newName, saveType) is not { } option) throw new Exception($"Could not create new option with name {newName} in {group.Name}."); - return (option, idx, true); + return (option, true); } /// Add an existing option to a given group. @@ -86,7 +87,8 @@ public abstract class ModOptionEditor( return null; SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, clonedOption, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, clonedOption, + null, option.Id, -1)); return clonedOption; } @@ -95,24 +97,26 @@ public void DeleteOption(TOption option) { var mod = option.Mod; var group = option.Group; - var optionIdx = option.GetIndex(); - var oldName = option.Name; - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, mod, group, option, null, null, -1)); + var optionIdx = option.Index; + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, mod, group, option, null, + option.Id, -1)); RemoveOption((TGroup)group, optionIdx); SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionDeleted, mod, group, null, null, oldName, optionIdx)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionDeleted, mod, group, null, null, + option.Id, optionIdx)); } /// Move an option inside the given option group. public void MoveOption(TOption option, int optionIdxTo) { - var idx = option.GetIndex(); + var idx = option.Index; var group = (TGroup)option.Group; if (!MoveOption(group, idx, optionIdxTo)) return; SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMoved, group.Mod, group, option, null, null, idx)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMoved, group.Mod, group, option, null, + option.Id, idx)); } protected abstract TGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync); @@ -149,6 +153,7 @@ public static void HandlingInfo(this ModOptionChangeType type, out bool requires ModOptionChangeType.OptionMetaChanged => (false, true, false), ModOptionChangeType.DisplayChange => (false, false, false), ModOptionChangeType.DefaultOptionChanged => (true, false, false), + ModOptionChangeType.ConditionChanged => (false, true, false), _ => (false, false, false), }; } diff --git a/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs index 671b5ce22..be4f2b563 100644 --- a/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs @@ -13,11 +13,11 @@ public sealed class MultiModGroupEditor(CommunicatorService communicator, SaveSe { public void ChangeToSingle(MultiModGroup group) { - var idx = group.GetIndex(); + var idx = group.Index; var singleGroup = group.ConvertToSingle(); group.Mod.Groups[idx] = singleGroup; SaveService.QueueSave(new ModSaveGroup(singleGroup, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, singleGroup.Mod, singleGroup, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, singleGroup.Mod, singleGroup, null, null, group.Id, -1)); } /// Change the internal priority of the given option. @@ -28,7 +28,7 @@ public void ChangeOptionPriority(MultiSubMod option, ModPriority newPriority) option.Priority = newPriority; SaveService.QueueSave(new ModSaveGroup(option.Group, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, option.Mod, option.Group, option, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, option.Mod, option.Group, option, null, option.Id, -1)); } protected override MultiModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync) diff --git a/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs index 592a57ce3..22a14f4ae 100644 --- a/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs +++ b/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs @@ -13,11 +13,11 @@ public sealed class SingleModGroupEditor(CommunicatorService communicator, SaveS { public void ChangeToMulti(SingleModGroup group) { - var idx = group.GetIndex(); + var idx = group.Index; var multiGroup = group.ConvertToMulti(); group.Mod.Groups[idx] = multiGroup; SaveService.QueueSave(new ModSaveGroup(multiGroup, Config.ReplaceNonAsciiOnImport)); - Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, multiGroup.Mod, multiGroup, null, null, null, -1)); + Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, multiGroup.Mod, multiGroup, null, null, group.Id, -1)); } protected override SingleModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync) diff --git a/Penumbra/Mods/Mod.cs b/Penumbra/Mods/Mod.cs index 2a6c55b58..538f148dd 100644 --- a/Penumbra/Mods/Mod.cs +++ b/Penumbra/Mods/Mod.cs @@ -1,5 +1,6 @@ using Luna; using Luna.Generators; +using Penumbra.Files; using Penumbra.GameData.Data; using Penumbra.GameData.Structs; using Penumbra.Meta.Manipulations; @@ -56,15 +57,18 @@ public override string ToString() => Name; // Meta Data - public string Name { get; internal set; } = "New Mod"; - public string Author { get; internal set; } = string.Empty; - public string Description { get; internal set; } = string.Empty; - public string Version { get; internal set; } = string.Empty; - public string Website { get; internal set; } = string.Empty; - public string Image { get; internal set; } = string.Empty; - public IReadOnlyList ModTags { get; internal set; } = []; - public HashSet DefaultPreferredItems { get; internal set; } = []; - public FeatureFlags RequiredFeatures { get; internal set; } = 0; + public uint LoadedVersion { get; internal set; } = ModMeta.CurrentFileVersion; + public Guid StableIdentifier { get; internal set; } = Guid.NewGuid(); + public string Name { get; internal set; } = "New Mod"; + public string Author { get; internal set; } = string.Empty; + public string Description { get; internal set; } = string.Empty; + public string Version { get; internal set; } = string.Empty; + public string Website { get; internal set; } = string.Empty; + public string Image { get; internal set; } = string.Empty; + public IReadOnlyList ModTags { get; internal set; } = []; + public HashSet DefaultPreferredItems { get; internal set; } = []; + public FeatureFlags RequiredFeatures { get; internal set; } = 0; + public Dictionary PageNames { get; internal set; } = []; // Local Data @@ -78,8 +82,25 @@ public override string ToString() public bool Favorite { get; internal set; } // Options - public readonly DefaultSubMod Default; - public readonly List Groups = []; + public readonly Dictionary SubObjects = []; + public readonly DefaultSubMod Default; + public readonly IndexList Groups = []; + + /// Add a group and all its options to this mod and its dictionary. + /// Throws if the GUID for any of the objects already exists in the mod. + public void AddGroup(IModGroup? group, string filePath) + { + if (group is null) + return; + + Groups.Add(group); + foreach (var obj in group.Options.Prepend(group)) + { + if (!SubObjects.TryAdd(obj.Id, obj)) + throw new InvalidMetaException(this, filePath, + $"Multiple groups or options with the GUID {obj.Id} exist inside this mod."); + } + } /// Compute the required feature flags for this mod. public FeatureFlags ComputeRequiredFeatures() diff --git a/Penumbra/Mods/ModCreator.cs b/Penumbra/Mods/ModCreator.cs index e7c5401bb..760de31a5 100644 --- a/Penumbra/Mods/ModCreator.cs +++ b/Penumbra/Mods/ModCreator.cs @@ -108,7 +108,7 @@ public void LoadAllGroups(Mod mod) changes = changes || saveService.FileNames.OptionGroupFile(mod.ModPath.FullName, mod.Groups.Count, group.Name, true) != Path.Combine(file.DirectoryName!, file.Name.ReplaceBadXivSymbols(true)); - mod.Groups.Add(group); + mod.AddGroup(group, file.FullName); } else { @@ -245,7 +245,7 @@ public void IncorporateAllMetaChanges(Mod mod, bool delete, bool removeDefaultVa public static DirectoryInfo? NewSubFolderName(DirectoryInfo parentFolder, string subFolderName, bool onlyAscii) { var newModFolderBase = NewOptionDirectory(parentFolder, subFolderName, onlyAscii); - var newModFolder = FileSystemUtility.ObtainUniqueFile(newModFolderBase.FullName); + var newModFolder = newModFolderBase.FullName.ObtainUniqueFile(); return newModFolder.Length == 0 ? null : new DirectoryInfo(newModFolder); } diff --git a/Penumbra/Mods/ModMeta.cs b/Penumbra/Mods/ModMeta.cs index 7153f1dab..9bae851d5 100644 --- a/Penumbra/Mods/ModMeta.cs +++ b/Penumbra/Mods/ModMeta.cs @@ -21,17 +21,17 @@ public void Save(Stream stream) j.WriteStartObject(); j.WriteNumber("FileVersion"u8, CurrentFileVersion); - j.WriteString("Name"u8, mod.Name); - j.WriteString("Author"u8, mod.Author); - j.WriteString("Description"u8, mod.Description); - j.WriteString("Image"u8, mod.Image); - j.WriteString("Version"u8, mod.Version); - j.WriteString("Website"u8, mod.Website); + j.WriteString("Identifier"u8, mod.StableIdentifier); + j.WriteString("Name"u8, mod.Name); + j.WriteNonEmptyString("Author"u8, mod.Author); + j.WriteNonEmptyString("Description"u8, mod.Description); + j.WriteNonEmptyString("Image"u8, mod.Image); + j.WriteNonEmptyString("Version"u8, mod.Version); + j.WriteNonEmptyString("Website"u8, mod.Website); if (mod.ModTags.Count > 0) { - j.WritePropertyName("ModTags"u8); - j.WriteStartArray(); + j.WriteStartArray("ModTags"u8); foreach (var tag in mod.ModTags) j.WriteStringValue(tag); j.WriteEndArray(); @@ -39,8 +39,7 @@ public void Save(Stream stream) if (mod.DefaultPreferredItems.Count > 0) { - j.WritePropertyName("DefaultPreferredItems"u8); - j.WriteStartArray(); + j.WriteStartArray("DefaultPreferredItems"u8); foreach (var item in mod.DefaultPreferredItems) j.WriteNumberValue(item); j.WriteEndArray(); @@ -49,8 +48,7 @@ public void Save(Stream stream) if (mod.RequiredFeatures is not FeatureFlags.None) { var features = mod.RequiredFeatures; - j.WritePropertyName("RequiredFeatures"u8); - j.WriteStartArray(); + j.WriteStartArray("RequiredFeatures"u8); foreach (var flag in FeatureFlags.Values) { if ((features & flag) is not FeatureFlags.None) @@ -60,6 +58,14 @@ public void Save(Stream stream) j.WriteEndArray(); } + if (mod.PageNames.Count > 0) + { + j.WriteStartObject("PageNames"u8); + foreach (var (page, name) in mod.PageNames) + j.WriteString($"{page}", name); + j.WriteEndObject(); + } + j.WriteEndObject(); j.Flush(); } @@ -90,6 +96,7 @@ public static ModDataChangeType Load(ModDataEditor editor, ModCreator creator, M public struct Dto { public uint? FileVersion; + public Guid? StableIdentifier; public string? Name; public string? Author; public string? Description; @@ -109,6 +116,15 @@ public ModDataChangeType Apply(ModDataEditor editor, ModCreator creator, Mod mod mod.Name = Name ?? string.Empty; } + if (mod.StableIdentifier != StableIdentifier) + { + if (StableIdentifier.HasValue) + mod.StableIdentifier = StableIdentifier.Value; + else + mod.StableIdentifier = Guid.NewGuid(); + changes |= ModDataChangeType.Identifier; + } + if (mod.Author != Author) { changes |= ModDataChangeType.Author; @@ -186,31 +202,33 @@ public static Dto Read(ref Utf8JsonReader reader) throw new JsonException("Empty Data"); var ret = new Dto(); - var obj = reader.CreateObjectReader(); + var obj = reader.CreateObjectLimit(); while (obj.Read(ref reader)) { if (reader.TokenType is not JsonTokenType.PropertyName) throw new JsonException("Expected property"); - if (reader.CheckPropertyValue("FileVersion"u8)) + if (reader.CheckProperty("FileVersion"u8)) ret.FileVersion = reader.TryReadNumber(out uint fv) ? fv : throw new JsonException(); - else if (reader.CheckPropertyValue("Name"u8)) + else if (reader.CheckProperty("Identifier"u8)) + ret.StableIdentifier = reader.TryGetGuid(out var guid) ? guid : null; + else if (reader.CheckProperty("Name"u8)) ret.Name = reader.GetString(); - else if (reader.CheckPropertyValue("Author"u8)) + else if (reader.CheckProperty("Author"u8)) ret.Author = reader.GetString(); - else if (reader.CheckPropertyValue("Description"u8)) + else if (reader.CheckProperty("Description"u8)) ret.Description = reader.GetString(); - else if (reader.CheckPropertyValue("Image"u8)) + else if (reader.CheckProperty("Image"u8)) ret.Image = reader.GetString(); - else if (reader.CheckPropertyValue("Version"u8)) + else if (reader.CheckProperty("Version"u8)) ret.Version = reader.GetString(); - else if (reader.CheckPropertyValue("Website"u8)) + else if (reader.CheckProperty("Website"u8)) ret.Website = reader.GetString(); - else if (reader.CheckPropertyValue("ModTags"u8)) + else if (reader.CheckProperty("ModTags"u8)) ret.ModTags = reader.ReadStringArray()!; - else if (reader.CheckPropertyValue("DefaultPreferredItems"u8)) + else if (reader.CheckProperty("DefaultPreferredItems"u8)) ret.PreferredItems = reader.ReadNumberArray(); - else if (reader.CheckPropertyValue("RequiredFeatures"u8)) + else if (reader.CheckProperty("RequiredFeatures"u8)) ret.RequiredFeatures = reader.ReadFlagEnumArray() ?? FeatureFlags.None; else reader.Skip(); diff --git a/Penumbra/Mods/ModSelection.cs b/Penumbra/Mods/ModSelection.cs index 8b1092501..318472265 100644 --- a/Penumbra/Mods/ModSelection.cs +++ b/Penumbra/Mods/ModSelection.cs @@ -121,6 +121,9 @@ public enum Priority /// ModEditWindow = 0, + + /// + GroupNameCache = 0, } public readonly record struct Arguments(Mod? OldSelection, Mod? NewSelection); diff --git a/Penumbra/Mods/Settings/ModSettings.cs b/Penumbra/Mods/Settings/ModSettings.cs index 364032148..27c4a1e09 100644 --- a/Penumbra/Mods/Settings/ModSettings.cs +++ b/Penumbra/Mods/Settings/ModSettings.cs @@ -61,7 +61,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I case ModOptionChangeType.GroupRenamed: return true; case ModOptionChangeType.GroupAdded: // Add new empty setting for new mod. - Settings.Insert(group!.GetIndex(), group.DefaultSettings); + Settings.Insert(group!.Index, group.DefaultSettings); return true; case ModOptionChangeType.GroupDeleted: // Remove setting for deleted mod. @@ -72,7 +72,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I // Fix settings for a changed group type. // Single -> Multi: set single as enabled, rest as disabled // Multi -> Single: set the first enabled option or 0. - var idx = group!.GetIndex(); + var idx = group!.Index; var config = Settings[idx]; Settings[idx] = group.Type switch { @@ -86,7 +86,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I { // Single -> select the previous option if any. // Multi -> excise the corresponding bit. - var groupIdx = group!.GetIndex(); + var groupIdx = group!.Index; var config = Settings[groupIdx]; Settings[groupIdx] = group!.Type switch { @@ -99,13 +99,13 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I } case ModOptionChangeType.GroupMoved: // Move the group the same way. - return Settings.Move(fromIdx, group!.GetIndex()); + return Settings.Move(fromIdx, group!.Index); case ModOptionChangeType.OptionMoved: { // Single -> select the moved option if it was currently selected // Multi -> move the corresponding bit - var groupIdx = group!.GetIndex(); - var toIdx = option!.GetIndex(); + var groupIdx = group!.Index; + var toIdx = option!.Index; var config = Settings[groupIdx]; Settings[groupIdx] = group!.Type switch { diff --git a/Penumbra/Mods/SubMods/CombinedDataContainer.cs b/Penumbra/Mods/SubMods/CombinedDataContainer.cs index efaa6fd4a..3312b8cd1 100644 --- a/Penumbra/Mods/SubMods/CombinedDataContainer.cs +++ b/Penumbra/Mods/SubMods/CombinedDataContainer.cs @@ -14,6 +14,11 @@ public IMod Mod public IModGroup Group { get; } = group; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public string Name { get; set; } = string.Empty; public Dictionary Files { get; set; } = []; public Dictionary FileSwaps { get; set; } = []; @@ -28,7 +33,7 @@ public string GetName() return Name; var index = GetDataIndex(); - if (index == 0) + if (index is 0) return "None"; var sb = new StringBuilder(128); @@ -61,7 +66,7 @@ public unsafe string GetDirectoryName() for (var i = 0; i < Group.Options.Count; ++i) { text[Group.Options.Count - 1 - i] = (index & 1) is 0 ? '0' : '1'; - index >>= 1; + index >>= 1; } return new string(text); @@ -71,7 +76,7 @@ public string GetFullName() => $"{Group.Name}: {GetName()}"; public (int GroupIndex, int DataIndex) GetDataIndices() - => (Group.GetIndex(), GetDataIndex()); + => (Group.Index, GetDataIndex()); private int GetDataIndex() { diff --git a/Penumbra/Mods/SubMods/CombiningSubMod.cs b/Penumbra/Mods/SubMods/CombiningSubMod.cs index 563e3a585..76f985955 100644 --- a/Penumbra/Mods/SubMods/CombiningSubMod.cs +++ b/Penumbra/Mods/SubMods/CombiningSubMod.cs @@ -1,6 +1,7 @@ using Luna; using Newtonsoft.Json.Linq; using Penumbra.Mods.Groups; +using Penumbra.UI.Classes; namespace Penumbra.Mods.SubMods; @@ -8,21 +9,25 @@ public class CombiningSubMod(IModGroup group) : IModOption { public IModGroup Group { get; } = group; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public Mod Mod => Group.Mod; + public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = "Option"; public string Description { get; set; } = string.Empty; public ModSettingsLayout Layout { get; set; } + public ColorId Color { get; set; } public ICondition? Condition { get; set; } public string FullName => $"{Group.Name}: {Name}"; - public int GetIndex() - => SubMod.GetIndex(this); - public CombiningSubMod(CombiningModGroup group, JToken json) : this(group) => SubMod.LoadOptionData(json, this); diff --git a/Penumbra/Mods/SubMods/DefaultSubMod.cs b/Penumbra/Mods/SubMods/DefaultSubMod.cs index 3282f5185..bf50ba4bc 100644 --- a/Penumbra/Mods/SubMods/DefaultSubMod.cs +++ b/Penumbra/Mods/SubMods/DefaultSubMod.cs @@ -1,3 +1,4 @@ +using Luna; using Penumbra.Meta.Manipulations; using Penumbra.Mods.Editor; using Penumbra.Mods.Groups; @@ -11,6 +12,12 @@ public class DefaultSubMod(IMod mod) : IModDataContainer internal readonly IMod Mod = mod; + int IIndexed.Index + => -1; + + void IIndexed.SetIndex(int _) + { } + public Dictionary Files { get; set; } = []; public Dictionary FileSwaps { get; set; } = []; public MetaDictionary Manipulations { get; set; } = new(); diff --git a/Penumbra/Mods/SubMods/IModDataContainer.cs b/Penumbra/Mods/SubMods/IModDataContainer.cs index 008d5d5e8..ed560e271 100644 --- a/Penumbra/Mods/SubMods/IModDataContainer.cs +++ b/Penumbra/Mods/SubMods/IModDataContainer.cs @@ -1,3 +1,4 @@ +using Luna; using Penumbra.Meta.Manipulations; using Penumbra.Mods.Editor; using Penumbra.Mods.Groups; @@ -5,17 +6,19 @@ namespace Penumbra.Mods.SubMods; -public interface IModDataContainer +public interface IModDataContainer : IIndexed { public IMod Mod { get; } public IModGroup? Group { get; } + public int GroupIndex + => Group?.Index ?? -1; + public Dictionary Files { get; set; } public Dictionary FileSwaps { get; set; } public MetaDictionary Manipulations { get; set; } - public string GetName(); - public string GetDirectoryName(); - public string GetFullName(); - public (int GroupIndex, int DataIndex) GetDataIndices(); + public string GetName(); + public string GetDirectoryName(); + public string GetFullName(); } diff --git a/Penumbra/Mods/SubMods/IModOption.cs b/Penumbra/Mods/SubMods/IModOption.cs index e5dc1f8c1..844817af3 100644 --- a/Penumbra/Mods/SubMods/IModOption.cs +++ b/Penumbra/Mods/SubMods/IModOption.cs @@ -1,26 +1,114 @@ using Luna; using Penumbra.Mods.Groups; +using Penumbra.Mods.Settings; +using Penumbra.UI.Classes; namespace Penumbra.Mods.SubMods; [Flags] public enum ModSettingsLayout : ulong { - None = 0, - Disable = 0x01, // Disable the option or group instead of hiding it when the conditions are not fulfilled. - Indent = 0x02, // Indent the group if it is placed under another option or group. + None = 0, + Disable = 0x01, // Disable the option or group instead of hiding it when the conditions are not fulfilled. + Indent = 0x02, // Indent the group if it is placed under another option or group. + ParentHeader = 0x04, // Show the groups name or just its options if it is placed under another option or group. + Separator = 0x08, // Add a separator after this option. + DefaultClosed = 0x10, // A group should be closed by default. } -public interface IModOption +public interface IModObject : CycleChecker.IHasParent, IEquatable { - public Mod Mod { get; } - public IModGroup Group { get; } - + public Mod Mod { get; } + public IModGroup Group { get; } + public Guid Id { get; set; } public string Name { get; set; } - public string FullName { get; } public string Description { get; set; } public ModSettingsLayout Layout { get; set; } public ICondition? Condition { get; set; } - public int GetIndex(); + bool IEquatable.Equals(IModObject? other) + => ReferenceEquals(this, other); +} + +public interface IModOption : IModObject, IIndexed +{ + public string FullName { get; } + + public int GroupIndex + => Group.Index; + + public ColorId Color { get; set; } + + IModObject? CycleChecker.IHasParent.Parent + => Group.Parent; + + public static ColorId ConvertColor(int color) + => color switch + { + 1 => ColorId.OptionColor1, + 2 => ColorId.OptionColor2, + 3 => ColorId.OptionColor3, + 4 => ColorId.OptionColor4, + 5 => ColorId.OptionColor5, + 6 => ColorId.OptionColor6, + 7 => ColorId.OptionColor7, + 8 => ColorId.OptionColor8, + _ => default, + }; + + public int ColorAsInteger + => Color switch + { + ColorId.OptionColor1 => 1, + ColorId.OptionColor2 => 2, + ColorId.OptionColor3 => 3, + ColorId.OptionColor4 => 4, + ColorId.OptionColor5 => 5, + ColorId.OptionColor6 => 6, + ColorId.OptionColor7 => 7, + ColorId.OptionColor8 => 8, + _ => 0, + }; + + public bool IsEnabled(ModSettings settings) + { + var setting = settings.IsEmpty || settings.Settings.Count <= GroupIndex + ? Group.DefaultSettings + : settings.Settings[GroupIndex]; + if (Group.Behaviour is GroupDrawBehaviour.MultiSelection) + return setting.HasFlag(Index); + + return setting.AsIndex == Index; + } +} + +public static class ModSettingsLayoutExtensions +{ + public const ModSettingsLayout GroupValid = ModSettingsLayout.Disable | ModSettingsLayout.Indent | ModSettingsLayout.ParentHeader | ModSettingsLayout.DefaultClosed; + public const ModSettingsLayout OptionValid = ModSettingsLayout.Disable | ModSettingsLayout.Separator; + + extension(ModSettingsLayout layout) + { + public IEnumerable Iterate() + { + if (layout.HasFlag(ModSettingsLayout.Disable)) + yield return ModSettingsLayout.Disable; + if (layout.HasFlag(ModSettingsLayout.Indent)) + yield return ModSettingsLayout.Indent; + if (layout.HasFlag(ModSettingsLayout.ParentHeader)) + yield return ModSettingsLayout.ParentHeader; + if (layout.HasFlag(ModSettingsLayout.Separator)) + yield return ModSettingsLayout.Separator; + if (layout.HasFlag(ModSettingsLayout.DefaultClosed)) + yield return ModSettingsLayout.DefaultClosed; + } + + public ModSettingsLayout Reduce(IModObject @object) + => @object switch + { + IModGroup => layout & GroupValid, + IModOption => layout & OptionValid, + _ => 0, + }; + } } diff --git a/Penumbra/Mods/SubMods/ImcSubMod.cs b/Penumbra/Mods/SubMods/ImcSubMod.cs index 6e2bce4bd..cf2a41be0 100644 --- a/Penumbra/Mods/SubMods/ImcSubMod.cs +++ b/Penumbra/Mods/SubMods/ImcSubMod.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json.Linq; using Penumbra.GameData.Structs; using Penumbra.Mods.Groups; +using Penumbra.UI.Classes; namespace Penumbra.Mods.SubMods; @@ -9,6 +10,11 @@ public class ImcSubMod(ImcModGroup group) : IModOption { public readonly ImcModGroup Group = group; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public ImcSubMod(ImcModGroup group, JToken json) : this(group) { @@ -29,16 +35,20 @@ public Mod Mod => Group.Mod; public ushort AttributeMask; - public bool IsDisableSubMod { get; private init; } + public bool IsDisableSubMod { get; internal set; } - Mod IModOption.Mod + Mod IModObject.Mod => Mod; - IModGroup IModOption.Group + IModGroup IModObject.Group => Group; + public Guid Id { get; set; } = Guid.NewGuid(); + public string Name { get; set; } = "Part"; + public ColorId Color { get; set; } + public string FullName => $"{Group.Name}: {Name}"; diff --git a/Penumbra/Mods/SubMods/OptionSubMod.cs b/Penumbra/Mods/SubMods/OptionSubMod.cs index 143d97112..6f635ec59 100644 --- a/Penumbra/Mods/SubMods/OptionSubMod.cs +++ b/Penumbra/Mods/SubMods/OptionSubMod.cs @@ -3,6 +3,7 @@ using Penumbra.Mods.Editor; using Penumbra.Mods.Groups; using Penumbra.String.Classes; +using Penumbra.UI.Classes; namespace Penumbra.Mods.SubMods; @@ -13,16 +14,23 @@ public abstract class OptionSubMod(IModGroup group) : IModOption, IModDataContai public Mod Mod => Group.Mod; + public int Index { get; private set; } = -1; + + public void SetIndex(int index) + => Index = index; + public string Name { get; set; } = "Option"; public string Description { get; set; } = string.Empty; public ModSettingsLayout Layout { get; set; } + public ColorId Color { get; set; } + public ICondition? Condition { get; set; } public string FullName => $"{Group.Name}: {Name}"; - Mod IModOption.Mod + Mod IModObject.Mod => Mod; IMod IModDataContainer.Mod @@ -31,7 +39,9 @@ IMod IModDataContainer.Mod IModGroup IModDataContainer.Group => Group; - IModGroup IModOption.Group + public Guid Id { get; set; } = Guid.NewGuid(); + + IModGroup IModObject.Group => Group; public Dictionary Files { get; set; } = []; @@ -51,7 +61,7 @@ public string GetFullName() => FullName; public (int GroupIndex, int DataIndex) GetDataIndices() - => (Group.GetIndex(), GetDataIndex()); + => (Group.Index, GetDataIndex()); public int GetIndex() => SubMod.GetIndex(this); diff --git a/Penumbra/Mods/SubMods/SubMod.cs b/Penumbra/Mods/SubMods/SubMod.cs index 0a9858ded..4cbde85c0 100644 --- a/Penumbra/Mods/SubMods/SubMod.cs +++ b/Penumbra/Mods/SubMods/SubMod.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json.Linq; using Penumbra.Meta.Manipulations; using Penumbra.String.Classes; +using Penumbra.UI.Classes; namespace Penumbra.Mods.SubMods; @@ -127,5 +128,11 @@ public static void WriteModOption(JsonWriter j, IModOption option) j.WriteValue(option.Name); j.WritePropertyName(nameof(option.Description)); j.WriteValue(option.Description); + var color = option.ColorAsInteger; + if (color is not 0) + { + j.WritePropertyName(nameof(option.Color)); + j.WriteValue(color); + } } } diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs index d97585987..659a9deea 100644 --- a/Penumbra/Penumbra.cs +++ b/Penumbra/Penumbra.cs @@ -233,9 +233,10 @@ private void GatherRelevantPlugins(StringBuilder sb) "Glamourer", "CustomizePlus", "SimpleHeels", "Ktisis", "Brio", "heliosphere-plugin", "VfxEditor", "IllusioVitae", "Aetherment", - "DynamicBridge", "GagSpeak", "ProjectGagSpeak", "RoleplayingVoiceDalamud", "AQuestReborn", "Proteus", "DragAndDropTexturing", "CharacterSelectPlugin", + "DynamicBridge", "GagSpeak", "ProjectGagSpeak", "RoleplayingVoiceDalamud", "AQuestReborn", "Proteus", "DragAndDropTexturing", + "CharacterSelectPlugin", "MareSynchronos", "LoporritSync", "KittenSync", "Snowcloak", "LightlessSync", "Sphene", "XivSync", - "MareSempiterne" /* PlayerSync */, "AnatoliIliou", "LaciSynchroni", + "MareSempiterne" /* PlayerSync */, "AnatoliIliou", "LaciSynchroni", ]; var plugins = _services.GetService().InstalledPlugins .GroupBy(p => p.InternalName) @@ -244,8 +245,16 @@ private void GatherRelevantPlugins(StringBuilder sb) var item = g.OrderByDescending(p => p.IsLoaded).ThenByDescending(p => p.Version).First(); return (item.IsLoaded, item.Version, item.Name); }); + + foreach (var plugin in IpcProviders.Callers.OrderBy(p => p.Name).ThenBy(p => p.Version)) + sb.Append($"> **`{plugin.Name + ':',-29}`** {plugin.Version} (IPC)\n"); + foreach (var plugin in relevantPlugins) { + // Skip plugins included through caller tracking. + if (IpcProviders.Callers.Any(c => c.InternalName == plugin)) + continue; + if (plugins.TryGetValue(plugin, out var data)) sb.Append($"> **`{data.Name + ':',-29}`** {data.Version}{(data.IsLoaded ? string.Empty : " (Disabled)")}\n"); } @@ -285,7 +294,8 @@ public string GatherSupportInformation() $"> **`Synchronous Load (Dalamud): `** {(_services.GetService().GetDalamudConfig(DalamudConfigService.WaitingForPluginsOption, out bool v) ? v.ToString() : "Unknown")} (first Start: {hdrEnabler.FirstLaunchWaitForPluginsState?.ToString() ?? "Unknown"})\n"); sb.Append( $"> **`Logging: `** Log: {_config.Filters.ResourceLoggerWriteToLog}, Watcher: {_config.Filters.ResourceLoggerEnabled} ({_config.Filters.ResourceLoggerMaxEntries})\n"); - sb.Append($"> **`Use Ownership: `** {_config.UseOwnerNameForCharacterCollection}\n"); + sb.Append( + $"> **`Use Ownership: `** {_config.UseOwnerNameForCharacterCollection} (Hostiles: {_config.UseOwnerForHostiles})\n"); GatherRelevantPlugins(sb); sb.AppendLine("**Mods**"); sb.Append($"> **`Installed Mods: `** {_modManager.Count}\n"); diff --git a/Penumbra/Penumbra.csproj b/Penumbra/Penumbra.csproj index 2241f124a..85161d047 100644 --- a/Penumbra/Penumbra.csproj +++ b/Penumbra/Penumbra.csproj @@ -53,10 +53,10 @@ - - - - + + + + diff --git a/Penumbra/Services/ArchiveExtractionNotification.cs b/Penumbra/Services/ArchiveExtractionNotification.cs new file mode 100644 index 000000000..3fa7c8f62 --- /dev/null +++ b/Penumbra/Services/ArchiveExtractionNotification.cs @@ -0,0 +1,91 @@ +using Dalamud.Interface.ImGuiNotification; +using Dalamud.Interface.ImGuiNotification.EventArgs; +using ImSharp; +using Luna; + +namespace Penumbra.Services; + +public sealed class ArchiveExtractionNotification(MessageService messageService) + : AmassingNotification(messageService), IService +{ + public readonly record struct ArchiveInfo(string ArchiveName, int ModCount); + + private volatile bool _isExtracting; + private volatile int _currentEntryIndex; + private volatile int _totalEntries; + private volatile string? _currentEntryName; + + private bool _wasExtracting; + + public void AddArchive(string archiveName, int modCount) + => AddObject(new ArchiveInfo(archiveName, modCount)); + + public void SetProgress(int currentEntry, int totalEntries, string entryName) + { + _currentEntryIndex = currentEntry; + _totalEntries = totalEntries; + _currentEntryName = entryName; + _isExtracting = true; + } + + public void ClearProgress() + { + _isExtracting = false; + _currentEntryIndex = 0; + _totalEntries = 0; + _currentEntryName = null; + } + + public override NotificationType NotificationType + => NotificationType.Info; + + public override string NotificationTitle + => Count switch + { + 1 => $"Extracting mods from {GatheredObjects[0].ArchiveName}", + _ => $"Extracting mods from {Count} archives", + }; + + public override string NotificationMessage + => _isExtracting + ? $"Extracting '{_currentEntryName}'..." + : "Waiting..."; + + public override TimeSpan NotificationDuration + => TimeSpan.MaxValue; + + public override void NotificationActions(INotificationDrawArgs args) + { + if (_isExtracting) + { + _wasExtracting = true; + var total = _totalEntries; + if (total > 0 && CurrentNotification is { } notification) + { + notification.Progress = _currentEntryIndex / (float)total; + notification.Content = $"Extracting '{_currentEntryName}' ({_currentEntryIndex + 1} of {total})..."; + } + } + else if (_wasExtracting) + { + _wasExtracting = false; + if (CurrentNotification is { } notification) + { + notification.Progress = 1.0f; + notification.Content = "Extraction complete."; + notification.InitialDuration = TimeSpan.FromSeconds(15); + } + } + } + + protected override StoredNotification CreateStored(in ArchiveInfo @object) + => new Stored(this, @object); + + private sealed class Stored(ArchiveExtractionNotification parent, ArchiveInfo info) + : StoredNotification(parent, info) + { + public override string LogMessage { get; } = $"Extracted {info.ModCount} mod(s) from {info.ArchiveName}."; + public override StringU8 StoredMessage { get; } = new($"[{info.ArchiveName}] {info.ModCount} mod(s) extracted."); + public override StringU8 StoredTooltip { get; } = new($"Archive: {info.ArchiveName}\nMods found: {info.ModCount}"); + } +} diff --git a/Penumbra/Services/FileWatcher.cs b/Penumbra/Services/FileWatcher.cs index b2eab1e1a..47724eb5f 100644 --- a/Penumbra/Services/FileWatcher.cs +++ b/Penumbra/Services/FileWatcher.cs @@ -1,6 +1,10 @@ -using ImSharp; +using ImSharp; using Luna; using Penumbra.Mods.Manager; +using SharpCompress.Archives; +using SharpCompress.Archives.Rar; +using SharpCompress.Archives.SevenZip; +using ZipArchive = SharpCompress.Archives.Zip.ZipArchive; namespace Penumbra.Services; @@ -8,23 +12,46 @@ public sealed class FileWatcher : IDisposable, IService { private readonly ConcurrentSet _pending = new(StringComparer.OrdinalIgnoreCase); private readonly ConcurrentDictionary _ignored = new(StringComparer.OrdinalIgnoreCase); + private readonly ConcurrentDictionary _extractedArchives = new(StringComparer.OrdinalIgnoreCase); private readonly ModImportManager _modImportManager; private readonly MessageService _messageService; private readonly Configuration _config; + private readonly ArchiveExtractionNotification _archiveExtractionNotification; private bool _pausedConsumer; private FileSystemWatcher? _fsw; private CancellationTokenSource? _cts = new(); private Task? _consumer; + private int _pendingNotifications; + + /// The maximum number of concurrently open "new mod found" install notifications before further ones are deferred. + private const int MaxPendingNotifications = 3; /// The time-to-live of ignore entries, in the same unit as , namely milliseconds. private const long IgnoreTimeToLive = 60000L; - public FileWatcher(ModImportManager modImportManager, MessageService messageService, Configuration config) + private static readonly HashSet ModExtensions = + new(StringComparer.OrdinalIgnoreCase) { ".pmp", ".pcp", ".ttmp", ".ttmp2" }; + + private static readonly HashSet ContainerExtensions = + new(StringComparer.OrdinalIgnoreCase) { ".zip", ".rar", ".7z" }; + + private static string GetTempPath(string basePath) + => Path.Combine(basePath, "Penumbra-FileWatcher"); + + /// + /// Subdirectory under the system temp directory used for extracted archive entries. + /// + + public FileWatcher(ModImportManager modImportManager, MessageService messageService, Configuration config, + ArchiveExtractionNotification archiveExtractionNotification) { - _modImportManager = modImportManager; - _messageService = messageService; - _config = config; + _modImportManager = modImportManager; + _messageService = messageService; + _config = config; + _archiveExtractionNotification = archiveExtractionNotification; + + WipeTempRoot(_config.WatchDirectory); if (_config.EnableDirectoryWatch) { @@ -52,12 +79,38 @@ public void Toggle(bool value) } } + public void ToggleContainerPeeking(bool value) + { + if (_config.EnableContainerPeeking == value) + return; + + _config.EnableContainerPeeking = value; + _config.Save(); + + // Re-create the FSW so its filter list reflects the new state. + if (_config.EnableDirectoryWatch && _fsw is not null) + SetupFileWatcher(_config.WatchDirectory); + } + public void IgnoreFile(string fullPath) { if (_config.EnableDirectoryWatch) _ignored[fullPath] = Environment.TickCount64 + IgnoreTimeToLive; } + /// + /// Deletes every extracted archive directory tracked by this instance. Called from the debug drawer. + /// + public void CleanExtracted() + { + foreach (var dir in _extractedArchives.Keys.ToList()) + { + if (TryDeleteDirectory(dir)) + _extractedArchives.TryRemove(dir, out _); + } + Penumbra.Log.Verbose("[FileWatcher] Manual cleanup of extracted archives requested."); + } + private void EndFileWatcher() { if (_fsw is null) @@ -77,18 +130,24 @@ private void SetupFileWatcher(string directory) InternalBufferSize = 32 * 1024, }; - // Only wake us for the exact patterns we care about + // Only wake us for the exact patterns we care about. _fsw.Filters.Add("*.pmp"); _fsw.Filters.Add("*.pcp"); _fsw.Filters.Add("*.ttmp"); _fsw.Filters.Add("*.ttmp2"); + if (_config.EnableContainerPeeking) + { + _fsw.Filters.Add("*.zip"); + _fsw.Filters.Add("*.rar"); + _fsw.Filters.Add("*.7z"); + } + _fsw.Created += OnPath; _fsw.Renamed += OnPath; UpdateDirectory(directory); } - private void EndConsumerTask() { if (_cts is not null) @@ -134,8 +193,14 @@ public void UpdateDirectory(string newPath) private void OnPath(object? sender, FileSystemEventArgs e) { - if (!_ignored.TryRemove(e.FullPath, out var expiresAtTickCount) || expiresAtTickCount <= Environment.TickCount64) - _pending.TryAdd(e.FullPath); + if (_ignored.TryRemove(e.FullPath, out var expiresAtTickCount) && expiresAtTickCount > Environment.TickCount64) + { + Penumbra.Log.Verbose($"[FileWatcher] FSW event for '{e.FullPath}' suppressed by ignore list."); + return; + } + + if (_pending.TryAdd(e.FullPath)) + Penumbra.Log.Verbose($"[FileWatcher] FSW event for '{e.FullPath}' enqueued."); } private async Task ConsumerLoopAsync(CancellationToken token) @@ -143,6 +208,7 @@ private async Task ConsumerLoopAsync(CancellationToken token) while (true) { GarbageCollectIgnored(); + var path = _pending.FirstOrDefault(); if (path is null || _pausedConsumer) { @@ -150,9 +216,24 @@ private async Task ConsumerLoopAsync(CancellationToken token) continue; } + var totalSw = Stopwatch.StartNew(); + Penumbra.Log.Verbose($"[FileWatcher] Picked up '{path}' from queue."); + + var removePath = true; try { - await ProcessOneAsync(path, token).ConfigureAwait(false); + var ext = Path.GetExtension(path); + if (ContainerExtensions.Contains(ext)) + { + if (_config.EnableContainerPeeking) + await ProcessContainerAsync(path, token).ConfigureAwait(false); + // else: peeking was toggled off after the event was queued; drop silently. + } + else if (ModExtensions.Contains(ext)) + { + removePath = await ProcessOneAsync(path, token).ConfigureAwait(false); + } + // else: extension we don't recognise (shouldn't happen given filters); drop silently. } catch (OperationCanceledException) { @@ -164,7 +245,11 @@ private async Task ConsumerLoopAsync(CancellationToken token) } finally { - _pending.TryRemove(path); + if (removePath) + { + _pending.TryRemove(path); + Penumbra.Log.Verbose($"[FileWatcher] Finished '{path}' in {totalSw.ElapsedMilliseconds}ms."); + } } } } @@ -178,54 +263,327 @@ private void GarbageCollectIgnored() } } - private async Task ProcessOneAsync(string path, CancellationToken token) + private async Task ProcessOneAsync(string path, CancellationToken token) + { + if (!await WaitForStableAsync(path, token).ConfigureAwait(false)) + return true; + + if (!_config.EnableAutomaticModImport && _pendingNotifications >= MaxPendingNotifications) + return false; + + Penumbra.Log.Verbose($"[FileWatcher] Triggering import for '{path}'."); + _ = TriggerImport(path); + return true; + } + + /// + /// Polls the file until two consecutive size readings match, indicating the writer is done. + /// Returns false if the file never settled within the retry budget or the token was canceled. + /// + private static async Task WaitForStableAsync(string path, CancellationToken token) { - // Downloads often finish via rename; file may be locked briefly. - // Wait until it exists and is readable; also require two stable size checks. const int maxTries = 40; - long lastLen = -1; + long lastLen = -1; + var sw = Stopwatch.StartNew(); for (var i = 0; i < maxTries && !token.IsCancellationRequested; i++) { if (!File.Exists(path)) { - await Task.Delay(100, token); + await Task.Delay(100, token).ConfigureAwait(false); continue; } try { - var fi = new FileInfo(path); - var len = fi.Length; + var len = new FileInfo(path).Length; if (len > 0 && len == lastLen) { - if (_config.EnableAutomaticModImport) - _modImportManager.AddUnpack(path); - else - _messageService.AddMessage(new InstallNotification(_modImportManager, path), false); - return; + Penumbra.Log.Verbose( + $"[FileWatcher] '{path}' stable at {len} bytes after {sw.ElapsedMilliseconds}ms ({i + 1} polls)."); + return true; } lastLen = len; } catch (IOException) { - Penumbra.Log.Debug($"[FileWatcher] File is still being written to."); + Penumbra.Log.Debug("[FileWatcher] File is still being written to."); } catch (UnauthorizedAccessException) { - Penumbra.Log.Debug($"[FileWatcher] File is locked."); + Penumbra.Log.Debug("[FileWatcher] File is locked."); } - await Task.Delay(150, token); + await Task.Delay(150, token).ConfigureAwait(false); + } + + Penumbra.Log.Verbose($"[FileWatcher] '{path}' did not stabilize within {sw.ElapsedMilliseconds}ms."); + return false; + } + + private Task TriggerImport(string path) + { + if (_config.EnableAutomaticModImport) + return _modImportManager.AddUnpack(path); + else + { + var tcs = new TaskCompletionSource(); + Interlocked.Increment(ref _pendingNotifications); + tcs.Task.ContinueWith(_ => Interlocked.Decrement(ref _pendingNotifications), TaskScheduler.Default); + _messageService.AddMessage(new InstallNotification(_modImportManager, path, tcs), false); + return tcs.Task; } } + /// + /// Opens an archive, scans entries for mod files (by entry-name extension only), extracts matches + /// into a per-archive subdirectory of , then queues each extracted file via + /// . Per-archive subdirectory keeps the original filename intact for the UI. + /// + private async Task ProcessContainerAsync(string path, CancellationToken token) + { + if (!await WaitForStableAsync(path, token).ConfigureAwait(false)) + return; + + var ext = Path.GetExtension(path); + string? archiveDir = null; + var extractedNow = new List(); + + try + { + var openSw = Stopwatch.StartNew(); + Penumbra.Log.Verbose($"[FileWatcher] Opening container '{path}'."); + using var archive = OpenArchive(path, ext); + if (archive is null) + return; + Penumbra.Log.Verbose( + $"[FileWatcher] Opened container '{path}' in {openSw.ElapsedMilliseconds}ms."); + + var enumSw = Stopwatch.StartNew(); + var candidates = archive.Entries + .Where(e => !e.IsDirectory + && e.Key is { Length: > 0 } key + && ModExtensions.Contains(Path.GetExtension(key))) + .ToList(); + Penumbra.Log.Verbose( + $"[FileWatcher] Enumerated entries of '{path}' in {enumSw.ElapsedMilliseconds}ms; {candidates.Count} mod entries found."); + + // Silent ignore for archives that contain nothing relevant + if (candidates.Count == 0) + return; + + var archiveName = Path.GetFileName(path); + _archiveExtractionNotification.AddArchive(archiveName, candidates.Count); + + Directory.CreateDirectory(GetTempPath(_config.WatchDirectory)); + archiveDir = Path.Combine(GetTempPath(_config.WatchDirectory), Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(archiveDir); + + foreach (var entry in candidates) + { + token.ThrowIfCancellationRequested(); + + if (entry.IsEncrypted) + { + Penumbra.Log.Warning( + $"[FileWatcher] Skipping encrypted entry '{entry.Key}' in container '{path}'."); + continue; + } + + var safeName = Path.GetFileName(entry.Key!); + var tempPath = Path.Combine(archiveDir, safeName); + + if (File.Exists(tempPath)) + { + Penumbra.Log.Warning( + $"[FileWatcher] Duplicate entry name '{safeName}' in container '{path}'; skipping later occurrence."); + continue; + } + + _archiveExtractionNotification.SetProgress(extractedNow.Count, candidates.Count, safeName); + + try + { + var extractSw = Stopwatch.StartNew(); + long bytesWritten; + await using (var input = entry.OpenEntryStream()) + await using (var output = new FileStream(tempPath, FileMode.CreateNew, FileAccess.Write, + FileShare.None, 81920, useAsync: true)) + { + await input.CopyToAsync(output, 81920, token).ConfigureAwait(false); + bytesWritten = output.Position; + } + + Penumbra.Log.Verbose( + $"[FileWatcher] Extracted '{safeName}' ({bytesWritten} bytes) in {extractSw.ElapsedMilliseconds}ms."); + extractedNow.Add(tempPath); + } + catch (OperationCanceledException) + { + TryDelete(tempPath); + throw; + } + catch (Exception ex) + { + Penumbra.Log.Warning( + $"[FileWatcher] Failed to extract '{entry.Key}' from '{path}': {ex.Message}"); + TryDelete(tempPath); + } + + // Yield between entries so a large archive doesn't monopolise the worker thread + // while the game is rendering. + await Task.Yield(); + } + + _archiveExtractionNotification.ClearProgress(); + + if (extractedNow.Count > 0) + _extractedArchives[archiveDir] = Environment.TickCount64; + else + TryDeleteDirectory(archiveDir); + } + catch (OperationCanceledException) + { + _archiveExtractionNotification.ClearProgress(); + if (archiveDir is not null) + TryDeleteDirectory(archiveDir); + throw; + } + catch (Exception ex) + { + _archiveExtractionNotification.ClearProgress(); + Penumbra.Log.Warning($"[FileWatcher] Failed to read container '{path}': {ex.Message}"); + if (archiveDir is not null) + TryDeleteDirectory(archiveDir); + return; + } + + // Hand each extracted file off as if it were a fresh drop. The freshly-closed stream means + // we can skip WaitForStableAsync here and call TriggerImport directly. + var allSucceeded = true; + foreach (var tempPath in extractedNow) + { + var succeeded = false; + try + { + Penumbra.Log.Verbose($"[FileWatcher] Triggering import for extracted '{tempPath}'."); + var results = await TriggerImport(tempPath).ConfigureAwait(false); + succeeded = results.Length > 0 && results.All(r => r.Error is null); + + foreach (var result in results) + { + if (result.Error is not null) + Penumbra.Log.Warning( + $"[FileWatcher] Import of '{result.File.Name}' encountered an error: {result.Error.Message}"); + } + } + catch (Exception ex) + { + Penumbra.Log.Warning( + $"[FileWatcher] Failed to import extracted file '{tempPath}': {ex.Message}"); + } + + if (succeeded) + { + if (TryDelete(tempPath)) + Penumbra.Log.Verbose($"[FileWatcher] Deleted extracted temp file '{tempPath}'."); + else + Penumbra.Log.Warning($"[FileWatcher] Could not delete extracted temp file '{tempPath}'."); + } + else + { + allSucceeded = false; + } + } + + if (archiveDir is not null && allSucceeded) + { + if (TryDeleteDirectory(archiveDir)) + { + _extractedArchives.TryRemove(archiveDir, out _); + Penumbra.Log.Verbose($"[FileWatcher] Cleaned up archive temp directory '{archiveDir}'."); + } + else + { + Penumbra.Log.Warning( + $"[FileWatcher] Could not fully clean archive temp directory '{archiveDir}'; " + + "it will remain tracked for manual cleanup."); + } + } + } + + private static IArchive? OpenArchive(string path, string extension) + => extension.ToLowerInvariant() switch + { + ".zip" => ZipArchive.OpenArchive(path), + ".rar" => RarArchive.OpenArchive(path), + ".7z" => SevenZipArchive.OpenArchive(path), + _ => null, + }; + + private static void WipeTempRoot(string watchDir) + { + try + { + if (Directory.Exists(GetTempPath(watchDir))) + { + foreach (var entry in Directory.EnumerateFileSystemEntries(GetTempPath(watchDir))) + { + if (Directory.Exists(entry)) + TryDeleteDirectory(entry); + else + TryDelete(entry); + } + } + else + { + Directory.CreateDirectory(GetTempPath(watchDir)); + } + } + catch (Exception ex) + { + Penumbra.Log.Warning($"[FileWatcher] Could not prepare temp root '{GetTempPath(watchDir)}': {ex.Message}"); + } + } + + private static bool TryDelete(string path) + { + try + { + if (File.Exists(path)) + File.Delete(path); + return true; + } + catch + { + return false; + } + } + + private static bool TryDeleteDirectory(string path) + { + try + { + if (Directory.Exists(path)) + Directory.Delete(path, recursive: true); + return true; + } + catch + { + return false; + } + + return true; // Ignore this path. + } + public void Dispose() { EndConsumerTask(); EndFileWatcher(); + // Cleanup of extracted files is intentionally skipped here. WipeTempRoot() on the next + // construction handles leftovers without blocking shutdown. } public sealed class FileWatcherDrawer(Configuration config, FileWatcher fileWatcher) : IUiService @@ -246,9 +604,15 @@ public void Draw() table.DrawColumn("Automatic Import"u8); table.DrawColumn($"{config.EnableAutomaticModImport}"); + table.DrawColumn("Container Peeking"u8); + table.DrawColumn($"{config.EnableContainerPeeking}"); + table.DrawColumn("Watched Directory"u8); table.DrawColumn(config.WatchDirectory); + table.DrawColumn("Temp Root"u8); + table.DrawColumn(GetTempPath(config.WatchDirectory)); + table.DrawColumn("File Watcher Path"u8); table.DrawColumn(fileWatcher._fsw?.Path ?? ""); @@ -277,6 +641,25 @@ public void Draw() <= 0 => $" {entry.Key}", var ttl => $"<{ttl}ms> {entry.Key}", }).ToList())); + + table.DrawColumn("Extracted Archives"u8); + table.DrawColumn(StringU8.Join((byte)'\n', fileWatcher._extractedArchives.Select(entry => + { + var ageSec = (Environment.TickCount64 - entry.Value) / 1000; + var fileCount = TryCountFiles(entry.Key); + return $"<{ageSec}s, {fileCount} files> {entry.Key}"; + }).ToList())); + + table.DrawColumn("Clean Extracted"u8); + table.NextColumn(); + if (Im.SmallButton("Delete All Extracted"u8)) + fileWatcher.CleanExtracted(); + } + + private static int TryCountFiles(string dir) + { + try { return Directory.Exists(dir) ? Directory.EnumerateFiles(dir).Count() : 0; } + catch { return 0; } } } } diff --git a/Penumbra/Services/InstallNotification.cs b/Penumbra/Services/InstallNotification.cs index 71c6884f1..44c665ca0 100644 --- a/Penumbra/Services/InstallNotification.cs +++ b/Penumbra/Services/InstallNotification.cs @@ -6,8 +6,11 @@ namespace Penumbra.Services; -public class InstallNotification(ModImportManager modImportManager, string filePath) : Luna.IMessage +public class InstallNotification(ModImportManager modImportManager, string filePath, TaskCompletionSource tcs) + : Luna.INotificationAwareMessage { + private bool _reportCancellationOnDismissal = true; + public NotificationType NotificationType => NotificationType.Info; @@ -37,7 +40,9 @@ public void OnNotificationActions(INotificationDrawArgs args) var buttonSize = new Vector2((region.X - Im.Style.ItemSpacing.X) / 2, 0); if (Im.Button("Install"u8, buttonSize)) { - modImportManager.AddUnpack(filePath); + _reportCancellationOnDismissal = false; + modImportManager.AddUnpack(filePath) + .ContinueWith(tcs.SetFromTask); args.Notification.DismissNow(); } @@ -45,4 +50,13 @@ public void OnNotificationActions(INotificationDrawArgs args) if (Im.Button("Ignore"u8, buttonSize)) args.Notification.DismissNow(); } + + public void OnNotificationCreated(IActiveNotification notification) + { + notification.Dismiss += _ => + { + if (_reportCancellationOnDismissal) + tcs.SetResult([]); + }; + } } diff --git a/Penumbra/Services/MigrationManager.cs b/Penumbra/Services/MigrationManager.cs index 34cf864f1..b6612755e 100644 --- a/Penumbra/Services/MigrationManager.cs +++ b/Penumbra/Services/MigrationManager.cs @@ -244,7 +244,7 @@ public void MigrateMdlDuringExtraction(ArchiveUtility.ReaderShim reader, string return; } - var path = Path.Combine(directory, reader.Entry.Key!); + var path = Path.CombineSafely(directory, reader.Entry.Key!); using var s = new MemoryStream(); using var e = reader.OpenEntryStream(); e.CopyTo(s); @@ -276,7 +276,7 @@ public void MigrateMtrlDuringExtraction(ArchiveUtility.ReaderShim reader, string return; } - var path = Path.Combine(directory, reader.Entry.Key); + var path = Path.CombineSafely(directory, reader.Entry.Key); using var s = new MemoryStream(); using var e = reader.OpenEntryStream(); e.CopyTo(s); @@ -299,7 +299,7 @@ public void MigrateMtrlDuringExtraction(ArchiveUtility.ReaderShim reader, string public void FixMipMaps(ArchiveUtility.ReaderShim reader, string directory) { - var path = Path.Combine(directory, reader.Entry.Key!); + var path = Path.CombineSafely(directory, reader.Entry.Key!); using var s = new MemoryStream(); using var e = reader.OpenEntryStream(); e.CopyTo(s); diff --git a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs index d7da7a148..d19cd2450 100644 --- a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs +++ b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs @@ -780,7 +780,8 @@ private void OnInheritanceChange(in CollectionInheritanceChanged.Arguments argum private void OnModOptionChange(in ModOptionChanged.Arguments arguments) { - if (arguments.Type is ModOptionChangeType.PrepareChange or ModOptionChangeType.PrepareGroupDeletion or ModOptionChangeType.GroupAdded or ModOptionChangeType.OptionAdded + if (arguments.Type is ModOptionChangeType.PrepareChange or ModOptionChangeType.PrepareGroupDeletion or ModOptionChangeType.GroupAdded + or ModOptionChangeType.OptionAdded or ModOptionChangeType.ConditionChanged || arguments.Mod != _mod) return; diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs index 189ba0166..a4952ab98 100644 --- a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs +++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs @@ -115,7 +115,7 @@ public void ChangeOption(IModDataContainer? subMod) { AppendTask(() => { - var (groupIdx, dataIdx) = subMod?.GetDataIndices() ?? (-1, 0); + var (groupIdx, dataIdx) = (subMod?.GroupIndex ?? -1, subMod?.Index ?? 0); _editor.LoadOption(groupIdx, dataIdx).Wait(); }); } diff --git a/Penumbra/UI/Classes/Colors.cs b/Penumbra/UI/Classes/Colors.cs index 9eadb7063..bb3ce4814 100644 --- a/Penumbra/UI/Classes/Colors.cs +++ b/Penumbra/UI/Classes/Colors.cs @@ -35,6 +35,14 @@ public enum ColorId : short TemporaryModSettingsTint, ChangedItemPreferenceStar, NoTint, + OptionColor1, + OptionColor2, + OptionColor3, + OptionColor4, + OptionColor5, + OptionColor6, + OptionColor7, + OptionColor8, } public static class Colors @@ -47,6 +55,7 @@ public static class Colors public const uint FilterActive = 0x807070FF; public const uint TutorialMarker = 0xFF20FFFF; public const uint TutorialBorder = 0xD00000FF; + private const string OptionColorTooltip = "A color used for the selectable text or label for a mod option. The mod creator can associate one of these 8 colors (or none for default text), but you can choose the actual color."; public static (uint DefaultColor, string Name, string Description) Data(this ColorId color) => color switch @@ -83,6 +92,14 @@ public static (uint DefaultColor, string Name, string Description) Data(this Col ColorId.NewModTint => ( 0x8000FF00, "New Mod Tint", "A mod that was newly imported or created during this session and has not been enabled yet. This color is used as a tint for the regular state colors."), ColorId.NoTint => ( 0x00000000, "No Tint", "The default tint for all mods."), ColorId.ChangedItemPreferenceStar => ( 0x30FFFFFF, "Preferred Changed Item Star", "The color of the star button in the mod panel's changed items tab to prioritize specific items."), + ColorId.OptionColor1 => ( 0xFFF8CD8E, "Selectable Color for Mod Option #1", OptionColorTooltip), + ColorId.OptionColor2 => ( 0xFFAAD898, "Selectable Color for Mod Option #2", OptionColorTooltip), + ColorId.OptionColor3 => ( 0xFF8AD1E6, "Selectable Color for Mod Option #3", OptionColorTooltip), + ColorId.OptionColor4 => ( 0xFF6B8CD9, "Selectable Color for Mod Option #4", OptionColorTooltip), + ColorId.OptionColor5 => ( 0xFFA38FD9, "Selectable Color for Mod Option #5", OptionColorTooltip), + ColorId.OptionColor6 => ( 0xFFDB9DB3, "Selectable Color for Mod Option #6", OptionColorTooltip), + ColorId.OptionColor7 => ( 0xFF6A5CC7, "Selectable Color for Mod Option #7", OptionColorTooltip), + ColorId.OptionColor8 => ( 0xFF6BB5A6, "Selectable Color for Mod Option #8", OptionColorTooltip), _ => throw new ArgumentOutOfRangeException( nameof( color ), color, null ), // @formatter:on }; diff --git a/Penumbra/UI/Combos/Combos.cs b/Penumbra/UI/Combos/Combos.cs index 9ad45bb88..802baedd5 100644 --- a/Penumbra/UI/Combos/Combos.cs +++ b/Penumbra/UI/Combos/Combos.cs @@ -7,7 +7,7 @@ namespace Penumbra.UI; public static class Combos { - public static readonly EnumCombo ModelRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName); + public static readonly EnumCombo ModelRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName, null, GameData.Enums.ModelRace.Values.Skip(1).ToArray()); public static readonly EnumCombo TailedRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName, null, [GameData.Enums.ModelRace.Miqote, GameData.Enums.ModelRace.AuRa, GameData.Enums.ModelRace.Hrothgar]); public static readonly EnumCombo Gender = new(GenderExtensions.ToNameU8, GenderExtensions.ToName); diff --git a/Penumbra/UI/Combos/OptionSelectCombo.cs b/Penumbra/UI/Combos/OptionSelectCombo.cs index 72c462594..dae0a4b06 100644 --- a/Penumbra/UI/Combos/OptionSelectCombo.cs +++ b/Penumbra/UI/Combos/OptionSelectCombo.cs @@ -18,8 +18,8 @@ public sealed class Option(IModDataContainer container) { public readonly IModDataContainer? Container = container; public readonly StringU8 FullName = new(container.GetFullName()); - public readonly int GroupIndex = container.Group?.GetIndex() ?? -1; - public readonly int DataIndex = container.GetDataIndices().DataIndex; + public readonly int GroupIndex = container.GroupIndex; + public readonly int DataIndex = container.Index; } private readonly Im.ColorStyleDisposable _border = new(); diff --git a/Penumbra/UI/Combos/SingleGroupCombo.cs b/Penumbra/UI/Combos/SingleGroupCombo.cs index 1bc5f15d7..b8cf8030f 100644 --- a/Penumbra/UI/Combos/SingleGroupCombo.cs +++ b/Penumbra/UI/Combos/SingleGroupCombo.cs @@ -2,6 +2,8 @@ using Luna; using Penumbra.Mods.Groups; using Penumbra.Mods.Settings; +using Penumbra.Mods.SubMods; +using Penumbra.UI.Classes; using Penumbra.UI.ModsTab.Groups; namespace Penumbra.UI; @@ -24,7 +26,7 @@ public SingleGroupCombo() protected override FilterComboBaseCache CreateCache() => new Cache(this); - public readonly record struct GroupCache(int OptionIndex, StringU8 Name, StringU8 Description); + public readonly record struct GroupCache(int OptionIndex, StringU8 Name, StringU8 Description, Vector4 Color, bool Separator); private readonly WeakReference _group = new(null!); private Setting _currentOption; @@ -41,7 +43,8 @@ public void Draw(ModGroupDrawer parent, SingleModGroup group, int groupIndex, Se protected override IEnumerable GetItems() => _group.TryGetTarget(out var target) - ? target.OptionData.Select(o => new GroupCache(o.GetIndex(), new StringU8(o.Name), new StringU8(o.Description))) + ? target.OptionData.Select(o => new GroupCache(o.GetIndex(), new StringU8(o.Name), new StringU8(o.Description), + o.Color is 0 ? Im.Style[ImGuiColor.Text] : o.Color.Value().ToVector(), o.Layout.HasFlag(ModSettingsLayout.Separator))) : []; protected override float ItemHeight @@ -49,7 +52,18 @@ protected override float ItemHeight protected override bool DrawItem(in GroupCache item, int globalIndex, bool selected) { - var ret = Im.Selectable(item.Name, selected); + bool ret; + using (ImGuiColor.Text.Push(item.Color)) + { + ret = Im.Selectable(item.Name, selected); + } + + if (item.Separator) + { + var right = Im.Item.LowerRightCorner; + Im.Window.DrawList.Shape.Line(right with { X = Im.Item.UpperLeftCorner.X }, right, ImGuiColor.Separator.Get()); + } + if (item.Description.Length > 0) { Im.Line.SameInner(); @@ -67,7 +81,8 @@ private sealed class Cache(SingleGroupCombo parent) : FilterComboBaseCache i.Name.CalculateSize().X + (i.Description.Length > 0 ? Im.Style.FrameHeightWithSpacing : 0)) - + 2 * Im.Style.FramePadding.X + Im.Style.ScrollbarSize; + + 2 * Im.Style.FramePadding.X + + Im.Style.ScrollbarSize; } } } diff --git a/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs b/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs index 8410d8289..c0640fb51 100644 --- a/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs +++ b/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs @@ -403,7 +403,7 @@ private static bool CtDragHalf(ReadOnlySpan label, ReadOnlySpan desc float max, float speed, Action setter) { var tmp = (float)value; - var result = Im.Drag(label, ref tmp, format, min, max, speed); + var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp); Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description); if (!result) return false; @@ -420,7 +420,7 @@ private static bool CtDragHalf(ReadOnlySpan label, ReadOnlySpan desc float min, float max, float speed) { var tmp = (float)value; - var result = Im.Drag(label, ref tmp, format, min, max, speed); + var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp); Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description); if (!result) return false; @@ -445,11 +445,12 @@ private static bool CtDragScalar(ReadOnlySpan label, ReadOnlySpan T max, float speed, Action setter) where T : unmanaged, INumber { var tmp = value; - var result = Im.Drag(label, ref tmp, format, min, max, speed); + var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp); Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description); if (!result || tmp == value) return false; + setter(tmp); return true; } @@ -458,7 +459,7 @@ private static bool CtDragScalar(ReadOnlySpan label, ReadOnlySpan T max, float speed) where T : unmanaged, INumber { var tmp = value; - var result = Im.Drag(label, ref tmp, format, min, max, speed); + var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp); Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description); if (!result || tmp == value) return false; diff --git a/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs b/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs index 5f0e874ec..34bd974c0 100644 --- a/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs +++ b/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs @@ -12,6 +12,7 @@ namespace Penumbra.UI.FileEditing.Models; public partial class ModelEditor { + public const int OffByOneOffset = 0; private const int MdlMaterialMaximum = ModelImporter.MaterialLimit; private const string MdlImportDocumentation = @@ -413,7 +414,7 @@ private static void DrawInvalidMaterialMarker() private bool DrawModelLodDetails(int lodIndex, bool disabled) { - using var lodNode = Im.Tree.Node($"Level of Detail #{lodIndex + 1}", TreeNodeFlags.DefaultOpen); + using var lodNode = Im.Tree.Node($"Level of Detail #{lodIndex + OffByOneOffset}", TreeNodeFlags.DefaultOpen); if (!lodNode) return false; @@ -428,7 +429,7 @@ private bool DrawModelLodDetails(int lodIndex, bool disabled) private bool DrawModelMeshDetails(int meshIndex, bool disabled) { - using var meshNode = Im.Tree.Node($"Mesh #{meshIndex + 1}", TreeNodeFlags.DefaultOpen); + using var meshNode = Im.Tree.Node($"Mesh #{meshIndex + OffByOneOffset}", TreeNodeFlags.DefaultOpen); if (!meshNode) return false; @@ -437,7 +438,7 @@ private bool DrawModelMeshDetails(int meshIndex, bool disabled) if (!table) return false; - table.SetupColumn("name"u8, TableColumnFlags.WidthFixed, 100 * Im.Style.GlobalScale); + table.SetupColumn("name"u8, TableColumnFlags.WidthFixed, 150 * Im.Style.GlobalScale); table.SetupColumn("field"u8, TableColumnFlags.WidthStretch, 1); var file = Mdl; @@ -521,7 +522,7 @@ private bool DrawSubMeshAttributes(in Im.TableDisposable table, int meshIndex, i var mesh = Mdl.Meshes[meshIndex]; var subMeshIndex = mesh.SubMeshIndex + subMeshOffset; - table.DrawFrameColumn($"Attributes #{subMeshOffset + 1}"); + table.DrawFrameColumn($"Submesh #{subMeshOffset + OffByOneOffset} Attributes "); table.NextColumn(); var attributes = GetSubMeshAttributes(subMeshIndex); diff --git a/Penumbra/UI/GlobalModImporter.cs b/Penumbra/UI/GlobalModImporter.cs index 2e63cd238..4c99ecb12 100644 --- a/Penumbra/UI/GlobalModImporter.cs +++ b/Penumbra/UI/GlobalModImporter.cs @@ -46,7 +46,7 @@ public void Dispose() } private void ImportFiles(IReadOnlyList files, IReadOnlyList _) - => _importManager.AddUnpack(files.Where(f => ValidModExtensions.Contains(Path.GetExtension(f)))); + => _importManager.AddUnpack(files.Where(f => ValidModExtensions.Contains(Path.GetExtension(f))).ToList()); private static bool ValidExtension(IDragDropManager manager) => manager.Extensions.Any(ValidModExtensions.Contains); diff --git a/Penumbra/UI/ManagementTab/BrokenModsTab.cs b/Penumbra/UI/ManagementTab/BrokenModsTab.cs index 1b52b14b5..3fdf9dd46 100644 --- a/Penumbra/UI/ManagementTab/BrokenModsTab.cs +++ b/Penumbra/UI/ManagementTab/BrokenModsTab.cs @@ -64,12 +64,12 @@ private static void DrawDeleteEmptyButton(FailedModNotification notification, Ca private static void DrawMoveToTempButton(FailedModNotification notification, ModManager mods, Cache cache) { + var path = Path.Combine(mods.BasePath.FullName, "broken_mods"); if (ImEx.Button("Move All Folders to Temp"u8, default, - $"Moves all folders in the list to the '{mods.BasePath.FullName}/broken_mods' directory to make it easier to move them out of the Root directory.", + $"Moves all folders in the list to the '{path}' directory to make it easier to move them out of the Root directory.", !LunaStyle.Modifier.Destructive)) { cache.Dirty |= IManagedCache.DirtyFlags.Custom; - var path = Path.Combine(mods.BasePath.FullName, "broken_mods"); try { var tmpDirectory = Directory.CreateDirectory(path); diff --git a/Penumbra/UI/ManagementTab/CleanupTab.cs b/Penumbra/UI/ManagementTab/CleanupTab.cs index b33618e0a..2133e2070 100644 --- a/Penumbra/UI/ManagementTab/CleanupTab.cs +++ b/Penumbra/UI/ManagementTab/CleanupTab.cs @@ -4,7 +4,7 @@ namespace Penumbra.UI.ManagementTab; -public sealed class CleanupTab(CleanupService cleanup, Configuration config) : ITab +public sealed class CleanupTab(CleanupService cleanup, FileWatcher fileWatcher, Configuration config) : ITab { public ReadOnlySpan Label => "General Cleanup"u8; @@ -52,5 +52,12 @@ public void DrawContent() cleanup.CleanupAllUnusedSettings(); if (!enabled) Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteModModifier} while clicking to remove settings."); + + if (ImEx.Button("Clear Extracted Archive Files"u8, default, + "Delete all temporary files extracted from archives by the File Watcher. Extracted files that have not yet been imported will be lost."u8, + !enabled || cleanup.IsRunning)) + fileWatcher.CleanExtracted(); + if (!enabled) + Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteModModifier} while clicking to delete files."); } } diff --git a/Penumbra/UI/ManagementTab/ManagementLog.cs b/Penumbra/UI/ManagementTab/ManagementLog.cs index db3028261..be3be51ad 100644 --- a/Penumbra/UI/ManagementTab/ManagementLog.cs +++ b/Penumbra/UI/ManagementTab/ManagementLog.cs @@ -1,6 +1,5 @@ using Luna; using Penumbra.Files; -using Penumbra.Services; namespace Penumbra.UI.ManagementTab; diff --git a/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs b/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs index 09aafc333..057b07955 100644 --- a/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs +++ b/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs @@ -35,7 +35,7 @@ public override void NotificationActions(INotificationDrawArgs args) if (Im.Button("Open Messages"u8, width)) navigator.OpenTo(TabType.Messages); Im.Line.SameInner(); - if (ImEx.Button("Open Management"u8, width, true)) + if (ImEx.Button("Open Management"u8, width)) navigator.OpenTo(ManagementTabType.BrokenMods); } diff --git a/Penumbra/UI/ModsTab/ConditionCombo.cs b/Penumbra/UI/ModsTab/ConditionCombo.cs new file mode 100644 index 000000000..e78decca2 --- /dev/null +++ b/Penumbra/UI/ModsTab/ConditionCombo.cs @@ -0,0 +1,108 @@ +using ImSharp; +using Penumbra.Mods.Groups; +using Penumbra.Mods.SubMods; + +namespace Penumbra.UI.ModsTab; + +internal sealed class ConditionCombo : ModObjectCombo +{ + private IModOption? _optionSelected; + private SettingCondition? _currentCondition; + private readonly Im.ColorStyleDisposable _style = new(); + + public ConditionCombo() + => PreviewAlignment = new Vector2(0.5f); + + protected override void PostDrawCombo(float width) + => _style.PopColor(); + + public bool Draw(ReadOnlySpan label, IModObject @object, float width, SettingCondition? existingCondition, + out SettingCondition? newCondition) + { + Mod = @object.Mod; + Group = @object.Group; + _optionSelected = @object as IModOption; + _currentCondition = existingCondition; + + var color = Rgba32.Blue.WithAlpha(51); + _style.PushDefault(ImStyleDouble.FramePadding) + .PushDefault(ImGuiColor.ChildBackground) + .PushDefault(ImGuiColor.Border) + .Push(ImGuiColor.FrameBackground, color); + + if (!base.Draw(label, _currentCondition?.Option.FullName ?? "Select New Condition...", + "Selecting an option here makes the display and application of this option or entire group dependent on the option being enabled."u8, + width, out var parent) + || parent.Object is not IModOption option + || option == existingCondition?.Option) + { + newCondition = existingCondition; + return false; + } + + if (_currentCondition is null) + { + newCondition = new SettingCondition(option); + } + else + { + newCondition = _currentCondition; + newCondition!.Option = option; + } + + _style.Dispose(); + return true; + } + + protected override IEnumerable GetItems() + { + if (Mod is null) + yield break; + + foreach (var group in Mod.Groups) + { + var parent = new ModObjectCache(group, null) + { + CausesCycle = false, + Visible = false, + }; + if (group == Group) + { + // Can not make a group dependent on itself, or an option in a single select group dependent on any options in its group. + if (_optionSelected is null || group.Behaviour is GroupDrawBehaviour.SingleSelection) + continue; + + // TODO: Check cycles and sensibility. + foreach (var option in group.Options) + { + // Can not depend on itself. + if (option == _optionSelected) + continue; + + yield return new ModObjectCache(option, parent); + } + } + else + { + // TODO: Check cycles and sensibility. + foreach (var option in group.Options) + yield return new ModObjectCache(option, parent); + } + } + } + + protected override bool DrawItem(in ModObjectCache item, int globalIndex, bool selected) + { + var ret = Im.Selectable(item.Name.Utf8, selected); + Im.Line.NoSpacing(); + using (ImGuiColor.Text.Push(Im.Style[ImGuiColor.TextDisabled])) + { + ImEx.TextRightAligned(item.GroupName.Utf8, Im.Style.FramePadding.X); + } + + return ret; + } + + protected override bool IsSelected(ModObjectCache item, int globalIndex) + => _currentCondition?.Option == item.Object; +} diff --git a/Penumbra/UI/ModsTab/ConditionEditPopup.cs b/Penumbra/UI/ModsTab/ConditionEditPopup.cs new file mode 100644 index 000000000..4446dd81e --- /dev/null +++ b/Penumbra/UI/ModsTab/ConditionEditPopup.cs @@ -0,0 +1,47 @@ +using ImSharp; +using Luna; +using Penumbra.Mods; +using Penumbra.Mods.Groups; +using Penumbra.Mods.Manager.OptionEditor; +using Penumbra.Mods.Settings; +using Penumbra.Mods.SubMods; +using Penumbra.Services; + +namespace Penumbra.UI.ModsTab; + +public sealed class ConditionEditPopup(ModGroupEditor editor, CommunicatorService communicator) : ObjectEditPopup, IUiService +{ + protected override ReadOnlySpan PopupId + => "ConditionEdit"u8; + + public void Open(IModObject @object) + => Open((object)@object); + + protected override void DrawInternal() + { + if (Current is not IModObject obj) + return; + + using var id = Im.Id.Push(obj.Id.GetHashCode()); + + var cache = CacheManager.Instance.GetOrCreateCache(Im.Id.Current, + () => new ModGroupConditionCache(communicator, new ModSettingContext(obj.Mod, ModSettings.Empty, obj))); + if (cache.Draw()) + editor.SetCondition(obj, obj.Condition?.Reduce(), true); + //ImNodes.Tester.Show("editor"u8); + + //Im.ScaledDummy(640); + //Im.Cursor.Position = cursor; + //if (drawer.Draw(obj.Condition, new ModSettingContext(obj.Mod, ModSettings.Empty, obj), out var newCondition)) + // obj.Condition = newCondition; + } + + protected override void PrePopup() + { + Im.Window.SetNextSize(ImEx.ScaledVector(640, 640)); + ImStyleDouble.WindowPadding.Push(Vector2.Zero); + } + + protected override void PostPopup() + => Im.StyleDisposable.PopUnsafe(); +} diff --git a/Penumbra/UI/ModsTab/DescriptionEditPopup.cs b/Penumbra/UI/ModsTab/DescriptionEditPopup.cs index 0489f4e10..9925229b1 100644 --- a/Penumbra/UI/ModsTab/DescriptionEditPopup.cs +++ b/Penumbra/UI/ModsTab/DescriptionEditPopup.cs @@ -1,4 +1,5 @@ using ImSharp; +using Luna; using Penumbra.Mods; using Penumbra.Mods.Groups; using Penumbra.Mods.Manager; @@ -6,65 +7,43 @@ namespace Penumbra.UI.ModsTab; -public class DescriptionEditPopup(ModManager modManager) : Luna.IUiService +public sealed class + DescriptionEditPopup(ModManager modManager) : ObjectEditPopup, IUiService { - private static ReadOnlySpan PopupId + protected override ReadOnlySpan PopupId => "EditDesc"u8; - private bool _hasBeenEdited; private StringU8 _description = StringU8.Empty; - private object? _current; - private bool _opened; - public void Open(Mod mod) { - _current = mod; - _opened = true; - _hasBeenEdited = false; - _description = new StringU8(mod.Description); + Open((object)mod); + _description = new StringU8(mod.Description); } public void Open(IModGroup group) { - _current = group; - _opened = true; - _hasBeenEdited = false; - _description = new StringU8(group.Description); + Open((object)group); + _description = new StringU8(group.Description); } public void Open(IModOption option) { - _current = option; - _opened = true; - _hasBeenEdited = false; - _description = new StringU8(option.Description); + Open((object)option); + _description = new StringU8(option.Description); } - public void Draw() + protected override void DrawInternal() { - if (_current is null) - return; - - if (_opened) - { - _opened = false; - Im.Popup.Open(PopupId); - } - - var inputSize = ImEx.ScaledVector(800); - using var popup = Im.Popup.Begin(PopupId); - if (!popup) - return; - if (Im.Window.Appearing) Im.Keyboard.SetFocusHere(); + var inputSize = ImEx.ScaledVector(800); if (Im.Input.MultiLine("##editDescription"u8, ref _description, inputSize)) - _hasBeenEdited = true; + Edited = true; UiHelpers.DefaultLineSpace(); - var buttonSize = new Vector2(Im.Style.GlobalScale * 100, 0); + var buttonSize = ImEx.ScaledVectorX(100); var width = 2 * buttonSize.X + 4 * Im.Style.FramePadding.X @@ -78,19 +57,18 @@ public void Draw() private void DrawSaveButton(Vector2 buttonSize) { - if (!ImEx.Button("Save"u8, buttonSize, _hasBeenEdited ? StringU8.Empty : "No changes made yet."u8, !_hasBeenEdited)) + if (!ImEx.Button("Save"u8, buttonSize, Edited ? StringU8.Empty : "No changes made yet."u8, !Edited)) return; - switch (_current) + switch (Current) { case Mod mod: modManager.DataEditor.ChangeModDescription(mod, _description.ToString()); break; case IModGroup group: modManager.OptionEditor.ChangeGroupDescription(group, _description.ToString()); break; case IModOption option: modManager.OptionEditor.ChangeOptionDescription(option, _description.ToString()); break; } - _description = StringU8.Empty; - _hasBeenEdited = false; - Im.Popup.CloseCurrent(); + _description = StringU8.Empty; + Close(); } private void DrawCancelButton(Vector2 buttonSize) @@ -98,8 +76,7 @@ private void DrawCancelButton(Vector2 buttonSize) if (!Im.Button("Cancel"u8, buttonSize) && !Im.Keyboard.IsPressed(Key.Escape)) return; - _description = StringU8.Empty; - _hasBeenEdited = false; - Im.Popup.CloseCurrent(); + _description = StringU8.Empty; + Close(); } } diff --git a/Penumbra/UI/ModsTab/Groups/AddGroupDrawer.cs b/Penumbra/UI/ModsTab/Groups/AddGroupDrawer.cs index c8545c101..7b78431ca 100644 --- a/Penumbra/UI/ModsTab/Groups/AddGroupDrawer.cs +++ b/Penumbra/UI/ModsTab/Groups/AddGroupDrawer.cs @@ -32,9 +32,14 @@ public AddGroupDrawer(ModManager modManager) public void Draw(Mod mod, float width) { - var buttonWidth = new Vector2((width - Im.Style.ItemInnerSpacing.X) / 2, 0); - DrawBasicGroups(mod, width, buttonWidth); - DrawImcData(mod, buttonWidth); + using var tree = Im.Tree.Node("Add Group"u8, TreeNodeFlags.DefaultOpen); + if (tree) + { + var buttonWidth = new Vector2((width - Im.Style.ItemInnerSpacing.X) / 2, 0); + DrawBasicGroups(mod, width, buttonWidth); + DrawImcData(mod, buttonWidth); + UiHelpers.DefaultLineSpace(); + } } private void DrawBasicGroups(Mod mod, float width, Vector2 buttonWidth) diff --git a/Penumbra/UI/ModsTab/Groups/GroupNameCache.cs b/Penumbra/UI/ModsTab/Groups/GroupNameCache.cs new file mode 100644 index 000000000..99e62a228 --- /dev/null +++ b/Penumbra/UI/ModsTab/Groups/GroupNameCache.cs @@ -0,0 +1,93 @@ +using ImSharp; +using Penumbra.Communication; +using Penumbra.Mods; +using Penumbra.Mods.Groups; +using Penumbra.Mods.Manager; +using Penumbra.Mods.Manager.OptionEditor; +using Penumbra.Services; + +namespace Penumbra.UI.ModsTab.Groups; + +public sealed class GroupNameCache : BasicCache +{ + private readonly CommunicatorService _communicator; + private readonly ModSelection _selection; + + public record PageData(StringPair Name, StringPair DefaultName, int Page, bool CustomName, bool Visible, List Groups) + { + public bool Visible { get; set; } = Visible; + } + + public readonly SortedList Pages = []; + public readonly List VisiblePages = []; + + public bool ShowPages + => VisiblePages.Count > 1; + + public GroupNameCache(CommunicatorService communicator, ModSelection selection) + { + _communicator = communicator; + _selection = selection; + communicator.ModDataChanged.Subscribe(OnModDataChange, ModDataChanged.Priority.GroupNameCache); + communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.GroupNameCache); + selection.Subscribe(OnSelectionChange, ModSelection.Priority.GroupNameCache); + } + + public override void Update() + { + if (!CustomDirty) + return; + + Pages.Clear(); + VisiblePages.Clear(); + if (_selection.Mod is not { } mod) + return; + + foreach (var (page, name) in mod.PageNames) + Pages.Add(page, new PageData(new StringPair(name), new StringPair($"Page {page + 1}"), page, true, false, [])); + + foreach (var group in mod.Groups) + { + if (!Pages.TryGetValue(group.Page, out var data)) + { + var defaultName = new StringPair($"Page {group.Page + 1}"); + data = new PageData(defaultName, defaultName, group.Page, false, group.IsOption, [group]); + Pages.Add(group.Page, data); + } + else + { + data.Groups.Add(group); + data.Visible |= group.IsOption; + } + } + + foreach (var page in Pages.Values.Where(p => p.Visible)) + VisiblePages.Add(page); + } + + private void OnModOptionChange(in ModOptionChanged.Arguments arguments) + { + if (arguments.Mod != _selection.Mod) + return; + + if (arguments.Type is ModOptionChangeType.GroupAdded or ModOptionChangeType.GroupDeleted or ModOptionChangeType.GroupMoved + or ModOptionChangeType.GroupRenamed or ModOptionChangeType.DisplayChange) + Dirty |= IManagedCache.DirtyFlags.Custom; + } + + private void OnModDataChange(in ModDataChanged.Arguments arguments) + { + if (arguments.Type is ModDataChangeType.PageNames && arguments.Mod == _selection.Mod) + Dirty |= IManagedCache.DirtyFlags.Custom; + } + + private void OnSelectionChange(in ModSelection.Arguments arguments) + => Dirty |= IManagedCache.DirtyFlags.Custom; + + protected override void Dispose(bool disposing) + { + _communicator.ModDataChanged.Unsubscribe(OnModDataChange); + _communicator.ModOptionChanged.Unsubscribe(OnModOptionChange); + _selection.Unsubscribe(OnSelectionChange); + } +} diff --git a/Penumbra/UI/ModsTab/Groups/ModGroupDrawer.cs b/Penumbra/UI/ModsTab/Groups/ModGroupDrawer.cs index 6306fc78f..ac0a53ebf 100644 --- a/Penumbra/UI/ModsTab/Groups/ModGroupDrawer.cs +++ b/Penumbra/UI/ModsTab/Groups/ModGroupDrawer.cs @@ -2,6 +2,7 @@ using Luna; using Penumbra.Collections; using Penumbra.Collections.Manager; +using Penumbra.Communication; using Penumbra.Mods; using Penumbra.Mods.Groups; using Penumbra.Mods.Settings; @@ -14,39 +15,136 @@ public sealed class ModGroupDrawer( Configuration config, CollectionManager collectionManager, SingleGroupCombo combo, - ModSelection selection, CommunicatorService communicator) : IUiService { private bool _temporary; private bool _locked; private TemporaryModSettings? _tempSettings; - private ModSettings? _settings; + private ModSettingContext _context; - public void Draw(Mod mod, ModSettings settings, TemporaryModSettings? tempSettings) + public void Draw(ModSettingsCache cache, Mod mod, ModSettings settings, TemporaryModSettings? tempSettings) { - var cache = CacheManager.Instance.GetOrCreateCache(Im.Id.Current, () => new ModSettingsCache(selection, config, communicator)); - if (cache.Count is 0) + if (cache.Count is 0 || cache.ActivePages is 0) return; - _settings = settings; + _context = new ModSettingContext(mod, tempSettings ?? settings); _tempSettings = tempSettings; _temporary = tempSettings is not null; _locked = (tempSettings?.Lock ?? 0) > 0; - Im.Dummy(UiHelpers.DefaultSpace); - foreach (var single in cache.SingleGroups) - DrawSingleGroupCombo(single.Group, single.Index, settings.IsEmpty ? single.Group.DefaultSettings : settings.Settings[single.Index]); + if (cache.ActivePages > 1) + { + Im.Dummy(UiHelpers.DefaultSpace); + using var tabBar = Im.TabBar.Begin("##pages"u8, TabBarFlags.FittingPolicyScroll); + if (!tabBar) + return; + + foreach (var (id, page) in cache.Pages) + { + using var _ = Im.Id.Push(id); + using var tabItem = tabBar.Item(page.Name, TabItemFlags.NoPushId); + if (!tabItem) + continue; + + using var child = Im.Child.Begin("##child"u8, false, WindowFlags.NoSavedSettings); + if (!child) + continue; + + Im.Dummy(UiHelpers.DefaultSpace); + foreach (var group in page.Groups) + DrawGroup(group); - if (cache.MultiGroups.Count > 0) + UiHelpers.DefaultLineSpace(); + communicator.PostSettingsPanelDraw.Invoke(new PostSettingsPanelDraw.Arguments(mod)); + } + } + else + { + var (id, page) = cache.Pages.First(); + using var _ = Im.Id.Push(id); Im.Dummy(UiHelpers.DefaultSpace); - foreach (var multi in cache.MultiGroups) + foreach (var group in page.Groups) + DrawGroup(group); + + UiHelpers.DefaultLineSpace(); + communicator.PostSettingsPanelDraw.Invoke(new PostSettingsPanelDraw.Arguments(mod)); + } + } + + private void DrawGroup(ModSettingsCache.ModGroupCache group) + { + using var indent = IndentGroup(group.Indented); + var setting = _context.Settings.IsEmpty ? group.Group.DefaultSettings : _context.Settings.Settings[group.Index]; + if (group.IsCombo) + DrawSingleGroupComboNew(group, setting); + else if (group.Behaviour is GroupDrawBehaviour.MultiSelection) + DrawMultiGroupNew(group, setting); + else + DrawSingleGroupRadio(group, setting); + + foreach (var child in group.Children) + DrawGroup(child); + } + + private void DrawSingleGroupComboNew(ModSettingsCache.ModGroupCache group, Setting setting) + { + using var id = Im.Id.Push(group.Index); + var line = new HeaderLine { - var option = settings.IsEmpty ? multi.Group.DefaultSettings : settings.Settings[multi.Index]; - if (multi.Behaviour is GroupDrawBehaviour.MultiSelection) - DrawMultiGroup(multi.Group, multi.Index, option); - else - DrawSingleGroupRadio(multi.Group, multi.Index, option); + Collapsible = false, + LeftDistance = 30 * Im.Style.GlobalScale, + RightDistance = 30 * Im.Style.GlobalScale, + ComboDistance = Im.Style.ItemSpacing.X * 2, + }; + var (_, popupId, popupBox) = line.Combo(group.Name, group.Description, group.Group.Options[setting.AsIndex].Name); + using var popup = Im.Combo.DrawPopup(popupId, popupBox); + if (!popup) + return; + + foreach (var option in group.Options) + { + id.Push(option.Data.Index); + if (Im.Selectable(option.Name, option.Data.Index == setting.AsIndex)) + SetModSetting(group.Group, group.Group.Index, Setting.Single(option.Data.Index)); + id.Pop(); + } + } + + private void DrawMultiGroupNew(ModSettingsCache.ModGroupCache group, Setting setting) + { + using var id = Im.Id.Push(group.Index); + var line = new HeaderLine + { + Collapsible = true, + DefaultClosed = group.Group.Layout.HasFlag(ModSettingsLayout.DefaultClosed), + LeftDistance = 30 * Im.Style.GlobalScale, + }; + var options = group.Options; + if (group.HideHeader || line.Basic(group.Name, group.Description)) + DrawOptions(); + + void DrawOptions() + { + using var disabled = Im.Disabled(_locked); + for (var idx = 0; idx < options.Count; ++idx) + { + using var i = Im.Id.Push(idx); + var option = options[idx]; + var enabled = setting.HasFlag(idx); + + if (Im.Checkbox(option.Name, ref enabled)) + SetModSetting(group.Group, group.Index, setting.SetBit(idx, enabled)); + + if (option.Description.Length > 0) + { + Im.Line.SameInner(); + LunaStyle.DrawAlignedHelpMarker(option.Description, treatAsHovered: Im.Item.Hovered()); + } + + foreach (var childGroup in option.Children) + DrawGroup(childGroup); + } } } @@ -54,11 +152,11 @@ public void Draw(Mod mod, ModSettings settings, TemporaryModSettings? tempSettin /// Draw a single group selector as a combo box. /// If a description is provided, add a help marker besides it. /// - private void DrawSingleGroupCombo(IModGroup group, int groupIdx, Setting setting) + private void DrawSingleGroupCombo(ModSettingsCache.ModGroupCache group, Setting setting) { - using var id = Im.Id.Push(groupIdx); + using var id = Im.Id.Push(group.Index); using var disabled = Im.Disabled(_locked); - combo.Draw(this, (SingleModGroup)group, groupIdx, setting); + combo.Draw(this, (SingleModGroup)group.Group, group.Index, setting); if (group.Description.Length > 0) { LunaStyle.DrawHelpMarkerLabel(group.Name, group.Description); @@ -74,13 +172,20 @@ private void DrawSingleGroupCombo(IModGroup group, int groupIdx, Setting setting /// Draw a single group selector as a set of radio buttons. /// If a description is provided, add a help marker besides it. /// - private void DrawSingleGroupRadio(IModGroup group, int groupIdx, Setting setting) + private void DrawSingleGroupRadio(ModSettingsCache.ModGroupCache group, Setting setting) { - using var id = Im.Id.Push(groupIdx); + using var id = Im.Id.Push(group.Index); var options = group.Options; var selectedOption = setting.AsIndex; - using var g = ImEx.FramedGroup(group.Name, LunaStyle.HelpMarker, group.Description); - DrawCollapseHandling(options, g.MinimumWidth, DrawOptions); + if (group.HideHeader) + { + DrawOptions(); + } + else + { + using var g = ImEx.FramedGroup(group.Name, LunaStyle.HelpMarker, group.Description); + DrawCollapseHandling(options, g.MinimumWidth, DrawOptions); + } return; @@ -92,13 +197,16 @@ void DrawOptions() using var i = Im.Id.Push(idx); var option = options[idx]; if (Im.RadioButton(option.Name, selectedOption == idx)) - SetModSetting(group, groupIdx, Setting.Single(idx)); + SetModSetting(group.Group, group.Index, Setting.Single(idx)); if (option.Description.Length is 0) continue; Im.Line.SameInner(); LunaStyle.DrawAlignedHelpMarker(option.Description, treatAsHovered: Im.Item.Hovered()); + + foreach (var childGroup in option.Children) + DrawGroup(childGroup); } } } @@ -107,20 +215,25 @@ void DrawOptions() /// Draw a multi group selector as a bordered set of checkboxes. /// If a description is provided, add a help marker in the title. /// - private void DrawMultiGroup(IModGroup group, int groupIdx, Setting setting) + private void DrawMultiGroup(ModSettingsCache.ModGroupCache group, Setting setting) { - using var id = Im.Id.Push(groupIdx); + using var id = Im.Id.Push(group.Index); var options = group.Options; - using (var g = ImEx.FramedGroup(group.Name, LunaStyle.HelpMarker, group.Description)) + if (group.HideHeader) { + DrawOptions(); + } + else + { + using var g = ImEx.FramedGroup(group.Name, LunaStyle.HelpMarker, group.Description); DrawCollapseHandling(options, g.MinimumWidth, DrawOptions); } - var label = new StringU8($"##multi{groupIdx}"); + var label = new InlineStringU8($"##m{group.Index:D4}"); if (Im.Item.RightClicked()) Im.Popup.Open(label); - DrawMultiPopup(group, groupIdx, label); + DrawMultiPopup(group, group.Index, label.GetBytes()); return; void DrawOptions() @@ -133,18 +246,21 @@ void DrawOptions() var enabled = setting.HasFlag(idx); if (Im.Checkbox(option.Name, ref enabled)) - SetModSetting(group, groupIdx, setting.SetBit(idx, enabled)); + SetModSetting(group.Group, group.Index, setting.SetBit(idx, enabled)); if (option.Description.Length > 0) { Im.Line.SameInner(); LunaStyle.DrawAlignedHelpMarker(option.Description, treatAsHovered: Im.Item.Hovered()); } + + foreach (var childGroup in option.Children) + DrawGroup(childGroup); } } } - private void DrawMultiPopup(IModGroup group, int groupIdx, StringU8 label) + private void DrawMultiPopup(ModSettingsCache.ModGroupCache group, int groupIdx, ReadOnlySpan label) { using var style = ImStyleSingle.PopupBorderThickness.Push(Im.Style.GlobalScale); using var popup = Im.Popup.Begin(label); @@ -155,13 +271,13 @@ private void DrawMultiPopup(IModGroup group, int groupIdx, StringU8 label) using var disabled = Im.Disabled(_locked); Im.Separator(); if (Im.Selectable("Enable All"u8)) - SetModSetting(group, groupIdx, Setting.AllBits(group.Options.Count)); + SetModSetting(group.Group, groupIdx, Setting.AllBits(group.Options.Count)); if (Im.Selectable("Disable All"u8)) - SetModSetting(group, groupIdx, Setting.Zero); + SetModSetting(group.Group, groupIdx, Setting.Zero); } - private void DrawCollapseHandling(IReadOnlyList options, float minWidth, Action draw) + private void DrawCollapseHandling(IReadOnlyList options, float minWidth, Action draw) { if (options.Count <= config.OptionGroupCollapsibleMin) { @@ -214,7 +330,7 @@ internal void SetModSetting(IModGroup group, int groupIdx, Setting setting) { if (_temporary || config.DefaultTemporaryMode) { - _tempSettings ??= new TemporaryModSettings(group.Mod, _settings); + _tempSettings ??= new TemporaryModSettings(group.Mod, _context.Settings); _tempSettings!.ForceInherit = false; _tempSettings!.Settings[groupIdx] = setting; collectionManager.Editor.SetTemporarySettings(Current, group.Mod, _tempSettings); @@ -224,4 +340,7 @@ internal void SetModSetting(IModGroup group, int groupIdx, Setting setting) collectionManager.Editor.SetModSetting(Current, group.Mod, groupIdx, setting); } } + + private static Im.IndentDisposable? IndentGroup(bool indent) + => indent ? Im.Indent(Im.Style.FrameHeight + Im.Style.ItemInnerSpacing.X) : null; } diff --git a/Penumbra/UI/ModsTab/Groups/ModGroupEditDrawer.cs b/Penumbra/UI/ModsTab/Groups/ModGroupEditDrawer.cs index b3ed5198e..526d2be51 100644 --- a/Penumbra/UI/ModsTab/Groups/ModGroupEditDrawer.cs +++ b/Penumbra/UI/ModsTab/Groups/ModGroupEditDrawer.cs @@ -19,8 +19,9 @@ public sealed class ModGroupEditDrawer( Configuration config, FilenameService filenames, DescriptionEditPopup descriptionPopup, - ImcChecker imcChecker, - ModGroupConditionDrawer conditionDrawer) : IUiService + LayoutEditPopup layoutPopup, + ConditionEditPopup conditionPopup, + ImcChecker imcChecker) : IUiService { private static ReadOnlySpan AcrossGroupsLabel => "##DragOptionAcross"u8; @@ -28,7 +29,6 @@ private static ReadOnlySpan AcrossGroupsLabel private static ReadOnlySpan InsideGroupLabel => "##DragOptionInside"u8; - internal readonly ModGroupConditionDrawer ConditionDrawer = conditionDrawer; internal readonly ImcChecker ImcChecker = imcChecker; internal readonly ModManager ModManager = modManager; internal readonly Queue ActionQueue = new(); @@ -54,27 +54,27 @@ private static ReadOnlySpan InsideGroupLabel private IModOption? _dragDropOption; private bool _draggingAcross; - public void Draw(Mod mod) + public void Draw(GroupNameCache cache, Mod mod) { PrepareStyle(); using var id = Im.Id.Push("ge"u8); foreach (var (groupIdx, group) in mod.Groups.Index()) - DrawGroup(group, groupIdx); + DrawGroup(cache, group, groupIdx); while (ActionQueue.TryDequeue(out var action)) action.Invoke(); } - private void DrawGroup(IModGroup group, int idx) + private void DrawGroup(GroupNameCache cache, IModGroup group, int idx) { using var id = Im.Id.Push(idx); using var frame = ImEx.FramedGroup($"Group #{idx + 1}"); - DrawGroupNameRow(group, idx); + DrawGroupNameRow(cache, group, idx); group.EditDrawer(this).Draw(); } - private void DrawGroupNameRow(IModGroup group, int idx) + private void DrawGroupNameRow(GroupNameCache cache, IModGroup group, int idx) { DrawGroupName(group); Im.Line.SameInner(); @@ -91,6 +91,8 @@ private void DrawGroupNameRow(IModGroup group, int idx) DrawGroupDelete(group); Im.Line.SameInner(); DrawGroupPriority(group); + Im.Line.SameInner(); + DrawGroupPage(cache, group); } private void DrawGroupName(IModGroup group) @@ -138,6 +140,18 @@ private void DrawGroupPriority(IModGroup group) Im.Tooltip.OnHover("Group Priority"u8); } + private void DrawGroupPage(GroupNameCache cache, IModGroup group) + { + Im.Item.SetNextWidth(PriorityWidth); + if (ImEx.InputOnDeactivation.Scalar("##GroupPage"u8, group.Page + 1, out var newPage)) + ModManager.OptionEditor.SetPage(group, newPage - 1); + Im.Tooltip.OnHover( + "The page this group is to be placed in. If this group has a parent, this setting is ignored.\n\nNote that the number seen here is offset by 1 compared to the number stored in the JSON file."); + Im.Line.SameInner(); + ImEx.TextFrameAligned(cache.ShowPages ? cache.Pages[group.Page].Name.Utf8 : "(Unused)"u8); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] private void DrawGroupDescription(IModGroup group) { @@ -149,7 +163,7 @@ private void DrawGroupDescription(IModGroup group) private void DrawGroupLayout(IModGroup group) { if (ImEx.Icon.Button(LunaStyle.LayoutIcon, "Edit group layout settings."u8)) - descriptionPopup.Open(group); + layoutPopup.Open(group); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -157,7 +171,7 @@ private void DrawGroupConditions(IModGroup group) { if (ImEx.Icon.Button(LunaStyle.ConditionIcon, "Edit group conditions."u8, textColor: group.Condition is not null ? LunaStyle.FavoriteColor : ColorParameter.Default)) - descriptionPopup.Open(group); + conditionPopup.Open(group); } private void DrawGroupMoveButtons(IModGroup group, int idx) @@ -252,7 +266,7 @@ private void DrawOptionDescription(IModOption option) private void DrawOptionLayout(IModOption option) { if (ImEx.Icon.Button(LunaStyle.LayoutIcon, "Edit option layout settings."u8)) - descriptionPopup.Open(option); + layoutPopup.Open(option); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -260,7 +274,7 @@ private void DrawOptionConditions(IModOption option) { if (ImEx.Icon.Button(LunaStyle.ConditionIcon, "Edit option conditions."u8, textColor: option.Condition is not null ? LunaStyle.FavoriteColor : ColorParameter.Default)) - descriptionPopup.Open(option); + conditionPopup.Open(option); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/Penumbra/UI/ModsTab/Groups/ModSettingsCache.cs b/Penumbra/UI/ModsTab/Groups/ModSettingsCache.cs index e86af64b6..addfd66b1 100644 --- a/Penumbra/UI/ModsTab/Groups/ModSettingsCache.cs +++ b/Penumbra/UI/ModsTab/Groups/ModSettingsCache.cs @@ -14,27 +14,47 @@ public sealed class ModSettingsCache : BasicCache { public sealed class ModGroupCache { + public record Option( + IModOption Data, + StringU8 Name, + StringU8 Description, + Setting Value, + float Width, + bool Disabled, + List Children); + public GroupDrawBehaviour Behaviour => Group.Behaviour; - public IModGroup Group = null!; - public int Index; - public bool IsCombo; - public StringU8 Name; - public StringU8 Description; - public float NameWidth; - public float ComboWidth; - public readonly List<(StringU8 Option, StringU8 Description, Setting Value, float Width, bool Disabled)> Options = []; - public bool Disabled; + public IModGroup Group = null!; + public StringU8 Name; + public StringU8 Description; + public readonly List