@@ -60,6 +60,34 @@ private static String upperStart(String nameAsString) {
6060 return c + nameAsString .substring (1 );
6161 }
6262
63+ static void addMatch (ClassOrInterfaceDeclaration target ) {
64+ if (target .isAbstract () || target .isInterface ()) {
65+ return ;
66+ }
67+ MethodDeclaration equals = target .addMethod ("match" , PUBLIC );
68+ equals .addModifier (FINAL );
69+ equals .addAnnotation (Override .class );
70+ equals .addAnnotation (Nullable .class );
71+ equals .setType ("MatchConditions" );
72+ final var o = getNullableObject ();
73+ equals .getParameters ().add (o );
74+ equals .addParameter ("MatchConditions" , "cond" );
75+
76+ BlockStmt body = equals .getBody ().get ();
77+ body .addStatement (parseStatement (
78+ "if(!(o instanceof %s other)) return null;" .formatted (target .getNameAsString ())));
79+ var fields = target .getFields ().stream ()
80+ .filter (it -> it .getAnnotationByName ("EqEx" ).isEmpty ())
81+ .flatMap (it -> it .getVariables ().stream ())
82+ .toList ();
83+ for (var field : fields ) {
84+ body .addStatement ("cond = MatchHelper.match(%s, other.%s, cond);"
85+ .formatted (field .getNameAsString (), field .getNameAsString ()));
86+ body .addStatement ("if(cond==null) {return null;}" );
87+ }
88+ body .addStatement ("return cond;" );
89+ }
90+
6391 static void addEquals (ClassOrInterfaceDeclaration target ) {
6492 if (target .isAbstract () || target .isInterface ()) {
6593 return ;
@@ -208,7 +236,6 @@ static void addAllWoOptFieldsConstructor(ClassOrInterfaceDeclaration target) {
208236 target .addMember (constr );
209237 }
210238
211-
212239 static void addOverrideConstructor (ClassOrInterfaceDeclaration target ) {
213240 if (target .isInterface ()) {
214241 return ;
0 commit comments