2525indent_lvl1 = " "
2626indent_lvl2 = indent_lvl1 * 2
2727indent_lvl3 = indent_lvl1 * 3
28+ return_indent = " "
2829
2930
3031@dataclass
@@ -75,7 +76,7 @@ def generate_getter(field: Field) -> str:
7576
7677 _validate_java_identifier (field_name )
7778
78- getter_name = "get" + field_name [ 0 ]. upper () + field_name [ 1 :]
79+ getter_name = _get_getter_name ( field )
7980
8081 getter = [
8182 "" ,
@@ -94,7 +95,7 @@ def generate_setter(field: Field) -> str:
9495
9596 _validate_java_identifier (field_name )
9697
97- setter_name = "set" + field_name [ 0 ]. upper () + field_name [ 1 :]
98+ setter_name = _get_setter_name ( field_name )
9899
99100 setter = [
100101 "" ,
@@ -106,26 +107,76 @@ def generate_setter(field: Field) -> str:
106107 return setter
107108
108109
110+ def generate_equals (class_name : str , fields : List [Field ]) -> str :
111+ equals = [
112+ "" ,
113+ f"{ indent_lvl1 } @Override" ,
114+ f"{ indent_lvl1 } public boolean equals(Object obj) {{" ,
115+
116+ f"{ indent_lvl2 } if (this == obj)" ,
117+ f"{ indent_lvl3 } return true;" ,
118+
119+ f"{ indent_lvl2 } if (!(obj instanceof { class_name } ))" ,
120+ f"{ indent_lvl3 } return false;" ,
121+
122+ f"{ indent_lvl2 } { class_name } that = ({ class_name } ) obj;"
123+ ]
124+
125+ for i , field in enumerate (fields ):
126+ _validate_java_identifier (field .name )
127+ getter_name = _get_getter_name (field )
128+ semicolon = ";" if i == (len (fields ) - 1 ) else ""
129+ if i == 0 :
130+ equals .append (f"{ indent_lvl2 } return Objects.equals({ getter_name } (), that.{ getter_name } ()){ semicolon } " )
131+ else :
132+ equals .append (f"{ indent_lvl2 } { return_indent } && Objects.equals({ getter_name } (), that.{ getter_name } ()){ semicolon } " )
133+ equals .append (f"{ indent_lvl1 } }}" )
134+
135+ return "\n " .join (equals )
136+
137+
109138def generate_hash_code (fields : List [Field ]) -> str :
110139 hash_code = [
111140 "" ,
112141 f"{ indent_lvl1 } @Override" ,
113- f"{ indent_lvl1 } public int hashCode() {{" ,
114- f"{ indent_lvl2 } return Objects.hash("
142+ f"{ indent_lvl1 } public int hashCode() {{"
115143 ]
116144
117145 for i , field in enumerate (fields ):
118146 _validate_java_identifier (field .name )
119- getter_name = "get" + field .name [0 ].upper () + field .name [1 :]
120- comma = "," if i < (len (fields ) - 1 ) else ""
121- hash_code .append (f"{ indent_lvl2 } { getter_name } (){ comma } " )
147+ hash_code .extend (_get_return_hash_lines (fields , index = i ))
122148
123- hash_code .append (f"{ indent_lvl2 } );" )
124149 hash_code .append (f"{ indent_lvl1 } }}" )
125150
126151 return "\n " .join (hash_code )
127152
128153
154+ def _get_return_hash_lines (fields , index ) -> List [str ]:
155+ field = fields [index ]
156+ getter_name = _get_getter_name (field )
157+ comma = "," if index < (len (fields ) - 1 ) else ""
158+ another_hash_line = f"{ indent_lvl2 } { return_indent } { getter_name } (){ comma } "
159+ if len (fields ) == 1 :
160+ return [f"{ indent_lvl2 } return Objects.hash({ getter_name } ());" ]
161+ if len (fields ) > 1 and index == 0 :
162+ return [f"{ indent_lvl2 } return Objects.hash(" ,
163+ f"{ another_hash_line } " ]
164+ if len (fields ) > 1 and index == (len (fields ) - 1 ):
165+ return [f"{ another_hash_line } " ,
166+ f"{ indent_lvl2 } );" ]
167+ return [another_hash_line ]
168+
169+
170+ def _get_getter_name (field ):
171+ getter_name = "get" + field .name [0 ].upper () + field .name [1 :]
172+ return getter_name
173+
174+
175+ def _get_setter_name (field_name ):
176+ setter_name = "set" + field_name [0 ].upper () + field_name [1 :]
177+ return setter_name
178+
179+
129180def _validate_java_identifier (name : str ) -> None :
130181 if not name :
131182 raise ValueError ("Field name cannot be empty" )
0 commit comments