diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..015dd0e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+[Dd]ebug/
+[Rr]elease/
+x64/
+[Bb]in/
+[Oo]bj/
+
+*.*~
+.vs
+.vscode
+.idea
+.gradle
+*.DotSettings.user
\ No newline at end of file
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..f709cb3
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 CodeWriter Packages
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LICENSE.md.meta b/LICENSE.md.meta
new file mode 100644
index 0000000..2f5e759
--- /dev/null
+++ b/LICENSE.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 696296fd279205641a1598ef8d354e90
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/README.md b/README.md
index 6a67756..c926f59 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,11 @@
-# RequireFieldsInit-Analyzer
\ No newline at end of file
+# RequireFieldsInit Analyzer
+
+## Usage
+
+Mark the struct with the `[RequireFieldsInit]` attribute.
+The compiler now requires you to initialize all fields
+in the object's initializer
+
+![Usage](https://user-images.githubusercontent.com/26966368/229343387-22f6a248-543b-4944-a2a7-9b9344c0aba1.png)
+![Usage](https://user-images.githubusercontent.com/26966368/229343423-b4f523e5-67d3-4c32-a383-9ff421c6c458.png)
+![Usage](https://user-images.githubusercontent.com/26966368/229343462-6ab6e16b-ef0e-444a-bac8-7e50240bcf13.png)
\ No newline at end of file
diff --git a/README.md.meta b/README.md.meta
new file mode 100644
index 0000000..fd88d92
--- /dev/null
+++ b/README.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4458f7ad6a60e964f898a0fb6fb523d7
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/RequireFieldsInit.Analyzer.dll b/RequireFieldsInit.Analyzer.dll
new file mode 100644
index 0000000..fd075df
Binary files /dev/null and b/RequireFieldsInit.Analyzer.dll differ
diff --git a/RequireFieldsInit.Analyzer.dll.meta b/RequireFieldsInit.Analyzer.dll.meta
new file mode 100644
index 0000000..35c6f47
--- /dev/null
+++ b/RequireFieldsInit.Analyzer.dll.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: b36a86cc6e6102f4ea5fa7e76460fb72
+labels:
+- RoslynAnalyzer
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 1
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CPU: AnyCPU
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/RequireFieldsInit.Core.dll b/RequireFieldsInit.Core.dll
new file mode 100644
index 0000000..d9c86b4
Binary files /dev/null and b/RequireFieldsInit.Core.dll differ
diff --git a/RequireFieldsInit.Core.dll.meta b/RequireFieldsInit.Core.dll.meta
new file mode 100644
index 0000000..8be89ef
--- /dev/null
+++ b/RequireFieldsInit.Core.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 8cb75e4e360f56b43b31a3a01f2fb4c0
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 1
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Sources~/RequireFieldsInit/.editorconfig b/Sources~/RequireFieldsInit/.editorconfig
new file mode 100644
index 0000000..88d6445
--- /dev/null
+++ b/Sources~/RequireFieldsInit/.editorconfig
@@ -0,0 +1,708 @@
+
+[*]
+charset = utf-8
+end_of_line = crlf
+trim_trailing_whitespace = false
+insert_final_newline = false
+indent_style = space
+indent_size = 4
+
+# 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 = false
+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 = true
+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_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_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.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.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.severity = warning
+dotnet_naming_rule.locals_rule.style = lower_camel_case_style
+dotnet_naming_rule.locals_rule.symbols = locals_symbols
+dotnet_naming_rule.local_constants_rule.severity = warning
+dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style
+dotnet_naming_rule.local_constants_rule.symbols = local_constants_symbols
+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.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.severity = warning
+dotnet_naming_rule.parameters_rule.style = lower_camel_case_style
+dotnet_naming_rule.parameters_rule.symbols = parameters_symbols
+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.severity = warning
+dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style_1
+dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols
+dotnet_naming_rule.private_static_fields_rule.severity = warning
+dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style_1
+dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols
+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.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.severity = warning
+dotnet_naming_rule.public_fields_rule.style = lower_camel_case_style
+dotnet_naming_rule.public_fields_rule.symbols = public_fields_symbols
+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.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.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_1.capitalization = camel_case
+dotnet_naming_style.lower_camel_case_style_1.required_prefix = _
+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:none
+dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
+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 = for_non_interface_members: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_array_and_object_initializer = false
+resharper_align_multiline_array_initializer = true
+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_switch_expression = false
+resharper_align_multiline_type_argument = true
+resharper_align_multiline_type_parameter = true
+resharper_align_multline_type_parameter_constrains = false
+resharper_align_multline_type_parameter_list = false
+resharper_align_ternary = align_not_nested
+resharper_align_tuple_components = false
+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_anonymous_method_declaration_braces = next_line
+resharper_apply_auto_detected_rules = true
+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 = true
+resharper_blank_lines_after_block_statements = 1
+resharper_blank_lines_after_case = 0
+resharper_blank_lines_after_control_transfer_statements = 0
+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 = 1
+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
+resharper_braces_for_foreach = required
+resharper_braces_for_ifelse = required
+resharper_braces_for_lock = required
+resharper_braces_for_using = required
+resharper_braces_for_while = required
+resharper_braces_redundant = false
+resharper_break_template_declaration = line_break
+resharper_can_use_global_alias = true
+resharper_constructor_or_destructor_body = block_body
+resharper_continuous_indent_multiplier = 1
+resharper_continuous_line_indent = single
+resharper_cpp_align_multiline_argument = true
+resharper_cpp_align_multiline_binary_expressions_chain = false
+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_case_block_braces = next_line_shifted_2
+resharper_cpp_indent_switch_labels = false
+resharper_cpp_max_line_length = 120
+resharper_cpp_new_line_before_while = true
+resharper_cpp_space_after_cast = false
+resharper_cpp_space_around_binary_operator = true
+resharper_cpp_wrap_lines = true
+resharper_csharp_align_multiline_argument = false
+resharper_csharp_align_multiline_binary_expressions_chain = true
+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 = false
+resharper_csharp_max_line_length = 120
+resharper_csharp_naming_rule.enum_member = AaBb
+resharper_csharp_naming_rule.method_property_event = AaBb
+resharper_csharp_naming_rule.other = AaBb
+resharper_csharp_naming_rule.public_fields = aaBb, AaBb
+resharper_csharp_new_line_before_while = false
+resharper_csharp_prefer_qualified_reference = false
+resharper_csharp_space_after_unary_operator = false
+resharper_csharp_wrap_lines = true
+resharper_cxxcli_property_declaration_braces = next_line
+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_empty_block_style = multiline
+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_format_leading_spaces_decl = false
+resharper_free_block_braces = next_line
+resharper_fsharp_align_function_signature_to_indentation = false
+resharper_fsharp_alternative_long_member_definitions = false
+resharper_fsharp_indent_on_try_with = false
+resharper_fsharp_keep_if_then_in_same_line = false
+resharper_fsharp_max_array_or_list_width = 40
+resharper_fsharp_max_elmish_width = 40
+resharper_fsharp_max_function_binding_width = 40
+resharper_fsharp_max_if_then_else_short_width = 40
+resharper_fsharp_max_infix_operator_expression = 50
+resharper_fsharp_max_line_length = 120
+resharper_fsharp_max_record_width = 40
+resharper_fsharp_max_value_binding_width = 40
+resharper_fsharp_multiline_block_brackets_on_same_column = false
+resharper_fsharp_newline_between_type_definition_and_members = false
+resharper_fsharp_semicolon_at_end_of_line = false
+resharper_fsharp_single_argument_web_mode = false
+resharper_fsharp_space_after_comma = true
+resharper_fsharp_space_after_semicolon = true
+resharper_fsharp_space_around_delimiter = true
+resharper_fsharp_space_before_class_constructor = false
+resharper_fsharp_space_before_colon = false
+resharper_fsharp_space_before_lowercase_invocation = true
+resharper_fsharp_space_before_member = false
+resharper_fsharp_space_before_parameter = true
+resharper_fsharp_space_before_semicolon = false
+resharper_fsharp_space_before_uppercase_invocation = false
+resharper_fsharp_wrap_lines = true
+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_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_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_method_decl_pars = inside
+resharper_indent_nested_fixed_stmt = false
+resharper_indent_nested_foreach_stmt = false
+resharper_indent_nested_for_stmt = false
+resharper_indent_nested_lock_stmt = false
+resharper_indent_nested_usings_stmt = false
+resharper_indent_nested_while_stmt = false
+resharper_indent_pars = inside
+resharper_indent_preprocessor_directives = normal
+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 = false
+resharper_int_align_comments = false
+resharper_int_align_declaration_names = false
+resharper_int_align_eq = false
+resharper_int_align_fix_in_adjacent = true
+resharper_invocable_declaration_braces = next_line
+resharper_keep_blank_lines_in_code = 2
+resharper_keep_blank_lines_in_declarations = 2
+resharper_keep_existing_attribute_arrangement = true
+resharper_keep_existing_declaration_block_arrangement = false
+resharper_keep_existing_declaration_parens_arrangement = true
+resharper_keep_existing_embedded_arrangement = true
+resharper_keep_existing_embedded_block_arrangement = false
+resharper_keep_existing_enum_arrangement = false
+resharper_keep_existing_expr_member_arrangement = true
+resharper_keep_existing_invocation_parens_arrangement = true
+resharper_keep_existing_property_patterns_arrangement = true
+resharper_keep_existing_switch_expression_arrangement = true
+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_linkage_specification_braces = end_of_line
+resharper_linkage_specification_indentation = none
+resharper_local_function_body = block_body
+resharper_max_array_initializer_elements_on_line = 10000
+resharper_max_attribute_length_for_same_line = 38
+resharper_max_enum_members_on_line = 3
+resharper_max_formal_parameters_on_line = 10000
+resharper_max_initializer_elements_on_line = 4
+resharper_max_invocation_arguments_on_line = 10000
+resharper_member_initializer_list_style = do_not_change
+resharper_method_or_operator_body = block_body
+resharper_namespace_declaration_braces = next_line
+resharper_namespace_indentation = all
+resharper_nested_ternary_style = autodetect
+resharper_never_outdent_pipe_operators = true
+resharper_new_line_before_catch = true
+resharper_new_line_before_else = true
+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_other_braces = next_line
+resharper_outdent_binary_operators = true
+resharper_outdent_binary_ops = false
+resharper_outdent_commas = false
+resharper_outdent_dots = false
+resharper_outdent_namespace_member = 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_pi_attributes_indent = align_by_first_attribute
+resharper_place_attribute_on_same_line = true
+resharper_place_comments_at_first_column = false
+resharper_place_constructor_initializer_on_same_line = true
+resharper_place_event_attribute_on_same_line = false
+resharper_place_expr_accessor_on_single_line = if_owner_is_single_line
+resharper_place_expr_method_on_single_line = if_owner_is_single_line
+resharper_place_expr_property_on_single_line = if_owner_is_single_line
+resharper_place_linq_into_on_new_line = true
+resharper_place_namespace_definitions_on_same_line = false
+resharper_place_property_attribute_on_same_line = false
+resharper_place_simple_case_statement_on_same_line = false
+resharper_place_simple_embedded_statement_on_same_line = if_owner_is_single_line
+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 = 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_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_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_shaderlab_brace_style = next_line
+resharper_shaderlab_max_line_length = 120
+resharper_shaderlab_wrap_lines = true
+resharper_show_autodetect_configure_formatting_tip = true
+resharper_simple_block_style = do_not_change
+resharper_simple_case_statement_style = do_not_change
+resharper_simple_embedded_statement_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_attributes = true
+resharper_space_after_attribute_target_colon = true
+resharper_space_after_colon = true
+resharper_space_after_colon_in_case = true
+resharper_space_after_colon_in_inheritance_clause = true
+resharper_space_after_comma = true
+resharper_space_after_for_colon = 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_operator_keyword = 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_semicolon_in_for_statement = true
+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_deref_in_trailing_return_type = true
+resharper_space_around_lambda_arrow = true
+resharper_space_around_member_access_operator = false
+resharper_space_around_relational_op = 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_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_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_initializer_braces = false
+resharper_space_before_invocation_parentheses = false
+resharper_space_before_label_colon = false
+resharper_space_before_lambda_parentheses = false
+resharper_space_before_method_parentheses = false
+resharper_space_before_nameof_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_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_semicolon = false
+resharper_space_before_semicolon_in_for_statement = 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_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_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_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_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_template_params = false
+resharper_space_within_expression_parentheses = false
+resharper_space_within_initializer_braces = false
+resharper_space_within_invocation_parentheses = false
+resharper_space_within_method_parentheses = false
+resharper_space_within_nameof_parentheses = false
+resharper_space_within_parentheses = false
+resharper_space_within_single_line_array_initializer_braces = false
+resharper_space_within_sizeof_parentheses = false
+resharper_space_within_template_args = 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_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_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_type_declaration_braces = next_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_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_lines = true
+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_arguments_style = wrap_if_long
+resharper_wrap_around_elements = true
+resharper_wrap_array_initializer_style = wrap_if_long
+resharper_wrap_base_clause_style = wrap_if_long
+resharper_wrap_before_arrow_with_expressions = false
+resharper_wrap_before_binary_opsign = false
+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_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 = 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_extends_list_style = wrap_if_long
+resharper_wrap_for_stmt_header_style = chop_if_long
+resharper_wrap_multiple_declaration_style = chop_if_long
+resharper_wrap_multiple_type_parameter_constraints_style = chop_if_long
+resharper_wrap_object_and_collection_initializer_style = chop_if_long
+resharper_wrap_parameters_style = wrap_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_verbatim_interpolated_strings = no_wrap
+resharper_xmldoc_attribute_indent = single_indent
+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_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
+
+[*.asmdef]
+indent_style = space
+indent_size = 2
+
+[*.{appxmanifest,asax,ascx,aspx,axaml,build,cg,cginc,compute,cs,cshtml,dtd,fs,fsi,fsscript,fsx,hlsl,hlsli,hlslinc,master,ml,mli,nuspec,paml,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}]
+indent_style = space
+indent_size = 4
+tab_width = 4
diff --git a/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInit.Analyzer.csproj b/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInit.Analyzer.csproj
new file mode 100644
index 0000000..d6d6ef2
--- /dev/null
+++ b/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInit.Analyzer.csproj
@@ -0,0 +1,30 @@
+
+
+
+ netstandard2.0
+ CodeWriter.RequireFieldsInit
+ cs
+ library
+ latest
+ true
+ false
+ false
+ true
+ true
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+ $(MSBuildProjectDirectory)\..\..\..\
+
+
+
+
+
diff --git a/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInitAnalyzer.cs b/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInitAnalyzer.cs
new file mode 100644
index 0000000..cfd0e46
--- /dev/null
+++ b/Sources~/RequireFieldsInit/RequireFieldsInit.Analyzer/RequireFieldsInitAnalyzer.cs
@@ -0,0 +1,130 @@
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.Diagnostics;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+
+namespace CodeWriter.RequireFieldsInit
+{
+ [DiagnosticAnalyzer(LanguageNames.CSharp)]
+ public class RequireFieldsInitAnalyzer : DiagnosticAnalyzer
+ {
+ private const string RequireFieldsInitAttributeName = "RequireFieldsInitAttribute";
+
+ private static readonly DiagnosticDescriptor Rule = new(
+ id: "RequireFieldsInit001",
+ title: "Missing field initialization",
+ messageFormat: "Missing field initialization: {0}",
+ category: "Usage",
+ defaultSeverity: DiagnosticSeverity.Error,
+ isEnabledByDefault: true
+ );
+
+ public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule);
+
+ public override void Initialize(AnalysisContext context)
+ {
+ context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze |
+ GeneratedCodeAnalysisFlags.ReportDiagnostics);
+ context.EnableConcurrentExecution();
+ context.RegisterCompilationStartAction(OnCompilationStart);
+ }
+
+ private void OnCompilationStart(CompilationStartAnalysisContext context)
+ {
+ var requiredFieldsCache =
+ new ConcurrentDictionary>(SymbolEqualityComparer.Default);
+ context.RegisterSyntaxNodeAction(ctx => CheckObjectCreation(ctx, requiredFieldsCache),
+ SyntaxKind.ObjectCreationExpression);
+ context.RegisterCompilationEndAction(_ => requiredFieldsCache.Clear());
+ }
+
+ private void CheckObjectCreation(
+ SyntaxNodeAnalysisContext context,
+ ConcurrentDictionary> requiredFieldsCache)
+ {
+ if (context.Node is not ObjectCreationExpressionSyntax creationSyntax)
+ {
+ return;
+ }
+
+ if (creationSyntax.Type is not IdentifierNameSyntax identifierNameSyntax)
+ {
+ return;
+ }
+
+ if (context.SemanticModel.GetSymbolInfo(identifierNameSyntax).Symbol is not INamedTypeSymbol typeSymbol)
+ {
+ return;
+ }
+
+ if (!requiredFieldsCache.TryGetValue(typeSymbol, out var allRequiredFields))
+ {
+ allRequiredFields = PopulateRequiredFields(typeSymbol);
+ requiredFieldsCache.TryAdd(typeSymbol, allRequiredFields);
+ }
+
+ if (allRequiredFields == null || allRequiredFields.Count == 0)
+ {
+ return;
+ }
+
+ Analyze(context, creationSyntax, allRequiredFields);
+ }
+
+ private void Analyze(
+ SyntaxNodeAnalysisContext context,
+ ObjectCreationExpressionSyntax creationSyntax,
+ HashSet requiredFields)
+ {
+ var initializerExpressions =
+ (IEnumerable) creationSyntax.Initializer?.Expressions ??
+ Array.Empty();
+
+ var initializedNames = initializerExpressions
+ .OfType()
+ .Select(it => it.Left is IdentifierNameSyntax idSyntax ? idSyntax.Identifier.Text : null)
+ .Where(it => it != null)
+ .ToArray();
+
+ foreach (var fieldName in requiredFields)
+ {
+ if (initializedNames.Contains(fieldName))
+ {
+ continue;
+ }
+
+ context.ReportDiagnostic(Diagnostic.Create(Rule, creationSyntax.Type.GetLocation(), fieldName));
+ }
+ }
+
+ private static HashSet PopulateRequiredFields(INamedTypeSymbol typeSymbol)
+ {
+ var requireFieldsInit = typeSymbol
+ .GetAttributes()
+ .Any(it => it.AttributeClass?.Name.Equals(RequireFieldsInitAttributeName, StringComparison.Ordinal) ??
+ false);
+
+ if (!requireFieldsInit)
+ {
+ return null;
+ }
+
+ var requiredFields = new HashSet();
+
+ foreach (var memberName in typeSymbol.MemberNames)
+ {
+ if (typeSymbol.GetMembers(memberName).OfType().Any())
+ {
+ requiredFields.Add(memberName);
+ }
+ }
+
+ return requiredFields;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInit.Core.csproj b/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInit.Core.csproj
new file mode 100644
index 0000000..a61742a
--- /dev/null
+++ b/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInit.Core.csproj
@@ -0,0 +1,13 @@
+
+
+
+ netstandard2.0
+
+
+
+ $(MSBuildProjectDirectory)\..\..\..\
+
+
+
+
+
diff --git a/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInitAttribute.cs b/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInitAttribute.cs
new file mode 100644
index 0000000..d7487a5
--- /dev/null
+++ b/Sources~/RequireFieldsInit/RequireFieldsInit.Core/RequireFieldsInitAttribute.cs
@@ -0,0 +1,6 @@
+using System;
+
+[AttributeUsage(AttributeTargets.Struct)]
+public class RequireFieldsInitAttribute : Attribute
+{
+}
\ No newline at end of file
diff --git a/Sources~/RequireFieldsInit/RequireFieldsInit.sln b/Sources~/RequireFieldsInit/RequireFieldsInit.sln
new file mode 100644
index 0000000..4b7b192
--- /dev/null
+++ b/Sources~/RequireFieldsInit/RequireFieldsInit.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.33516.290
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RequireFieldsInit.Core", "RequireFieldsInit.Core\RequireFieldsInit.Core.csproj", "{59C166A8-384A-4B8C-8292-A21D8E5D6B10}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RequireFieldsInit.Analyzer", "RequireFieldsInit.Analyzer\RequireFieldsInit.Analyzer.csproj", "{0F8206AA-8AF1-49AF-9B6A-3B1DD63A2755}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {59C166A8-384A-4B8C-8292-A21D8E5D6B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {59C166A8-384A-4B8C-8292-A21D8E5D6B10}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {59C166A8-384A-4B8C-8292-A21D8E5D6B10}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {59C166A8-384A-4B8C-8292-A21D8E5D6B10}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0F8206AA-8AF1-49AF-9B6A-3B1DD63A2755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0F8206AA-8AF1-49AF-9B6A-3B1DD63A2755}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0F8206AA-8AF1-49AF-9B6A-3B1DD63A2755}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0F8206AA-8AF1-49AF-9B6A-3B1DD63A2755}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {95D70CFE-96F3-4E37-B6E5-B0200DD09C6C}
+ EndGlobalSection
+EndGlobal
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e6af433
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "com.codewriter.require-fields-init-analyzer",
+ "displayName": "Require Fields Init Analyzer",
+ "description": "Require Fields Init Analyzer for Unity",
+ "version": "0.1.0",
+ "unity": "2021.3",
+ "license": "MIT",
+ "keywords": [
+ "unity"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/codewriter-packages/RequireFieldsInit-Analyzer.git"
+ },
+ "author": "CodeWriter (https://github.com/orgs/codewriter-packages)",
+ "homepage": "https://github.com/codewriter-packages/RequireFieldsInit-Analyzer#readme",
+ "dependencies": { }
+}
diff --git a/package.json.meta b/package.json.meta
new file mode 100644
index 0000000..1223e35
--- /dev/null
+++ b/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d3d240e3cd7ebf94d8a501f4a7acc17a
+PackageManifestImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: