EqualsVisitor.java revision 9528039468accca4734ee3b35670bd1d52369e4c
1/*
2 * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3 * Copyright (C) 2011, 2013-2016 The JavaParser Team.
4 *
5 * This file is part of JavaParser.
6 *
7 * JavaParser can be used either under the terms of
8 * a) the GNU Lesser General Public License as published by
9 *     the Free Software Foundation, either version 3 of the License, or
10 *     (at your option) any later version.
11 * b) the terms of the Apache License
12 *
13 * You should have received a copy of both licenses in LICENCE.LGPL and
14 * LICENCE.APACHE. Please refer to those files for details.
15 *
16 * JavaParser is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU Lesser General Public License for more details.
20 */
21
22package com.github.javaparser.ast.visitor;
23
24import java.util.List;
25
26import com.github.javaparser.ast.*;
27import com.github.javaparser.ast.type.TypeParameter;
28import com.github.javaparser.ast.body.AnnotationDeclaration;
29import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
30import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
31import com.github.javaparser.ast.body.ConstructorDeclaration;
32import com.github.javaparser.ast.body.EmptyMemberDeclaration;
33import com.github.javaparser.ast.body.EmptyTypeDeclaration;
34import com.github.javaparser.ast.body.EnumConstantDeclaration;
35import com.github.javaparser.ast.body.EnumDeclaration;
36import com.github.javaparser.ast.body.FieldDeclaration;
37import com.github.javaparser.ast.body.InitializerDeclaration;
38import com.github.javaparser.ast.body.MethodDeclaration;
39import com.github.javaparser.ast.body.Parameter;
40import com.github.javaparser.ast.body.VariableDeclarator;
41import com.github.javaparser.ast.body.VariableDeclaratorId;
42import com.github.javaparser.ast.comments.BlockComment;
43import com.github.javaparser.ast.comments.JavadocComment;
44import com.github.javaparser.ast.comments.LineComment;
45import com.github.javaparser.ast.expr.ArrayAccessExpr;
46import com.github.javaparser.ast.expr.ArrayCreationExpr;
47import com.github.javaparser.ast.expr.ArrayInitializerExpr;
48import com.github.javaparser.ast.expr.AssignExpr;
49import com.github.javaparser.ast.expr.BinaryExpr;
50import com.github.javaparser.ast.expr.BooleanLiteralExpr;
51import com.github.javaparser.ast.expr.CastExpr;
52import com.github.javaparser.ast.expr.CharLiteralExpr;
53import com.github.javaparser.ast.expr.ClassExpr;
54import com.github.javaparser.ast.expr.ConditionalExpr;
55import com.github.javaparser.ast.expr.DoubleLiteralExpr;
56import com.github.javaparser.ast.expr.EnclosedExpr;
57import com.github.javaparser.ast.expr.FieldAccessExpr;
58import com.github.javaparser.ast.expr.InstanceOfExpr;
59import com.github.javaparser.ast.expr.IntegerLiteralExpr;
60import com.github.javaparser.ast.expr.IntegerLiteralMinValueExpr;
61import com.github.javaparser.ast.expr.LambdaExpr;
62import com.github.javaparser.ast.expr.LongLiteralExpr;
63import com.github.javaparser.ast.expr.LongLiteralMinValueExpr;
64import com.github.javaparser.ast.expr.MarkerAnnotationExpr;
65import com.github.javaparser.ast.expr.MemberValuePair;
66import com.github.javaparser.ast.expr.MethodCallExpr;
67import com.github.javaparser.ast.expr.MethodReferenceExpr;
68import com.github.javaparser.ast.expr.NameExpr;
69import com.github.javaparser.ast.expr.NormalAnnotationExpr;
70import com.github.javaparser.ast.expr.NullLiteralExpr;
71import com.github.javaparser.ast.expr.ObjectCreationExpr;
72import com.github.javaparser.ast.expr.QualifiedNameExpr;
73import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr;
74import com.github.javaparser.ast.expr.StringLiteralExpr;
75import com.github.javaparser.ast.expr.SuperExpr;
76import com.github.javaparser.ast.expr.ThisExpr;
77import com.github.javaparser.ast.expr.TypeExpr;
78import com.github.javaparser.ast.expr.UnaryExpr;
79import com.github.javaparser.ast.expr.VariableDeclarationExpr;
80import com.github.javaparser.ast.stmt.AssertStmt;
81import com.github.javaparser.ast.stmt.BlockStmt;
82import com.github.javaparser.ast.stmt.BreakStmt;
83import com.github.javaparser.ast.stmt.CatchClause;
84import com.github.javaparser.ast.stmt.ContinueStmt;
85import com.github.javaparser.ast.stmt.DoStmt;
86import com.github.javaparser.ast.stmt.EmptyStmt;
87import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
88import com.github.javaparser.ast.stmt.ExpressionStmt;
89import com.github.javaparser.ast.stmt.ForStmt;
90import com.github.javaparser.ast.stmt.ForeachStmt;
91import com.github.javaparser.ast.stmt.IfStmt;
92import com.github.javaparser.ast.stmt.LabeledStmt;
93import com.github.javaparser.ast.stmt.ReturnStmt;
94import com.github.javaparser.ast.stmt.SwitchEntryStmt;
95import com.github.javaparser.ast.stmt.SwitchStmt;
96import com.github.javaparser.ast.stmt.SynchronizedStmt;
97import com.github.javaparser.ast.stmt.ThrowStmt;
98import com.github.javaparser.ast.stmt.TryStmt;
99import com.github.javaparser.ast.stmt.TypeDeclarationStmt;
100import com.github.javaparser.ast.stmt.WhileStmt;
101import com.github.javaparser.ast.type.*;
102
103/**
104 * @author Julio Vilmar Gesser
105 */
106public class EqualsVisitor implements GenericVisitor<Boolean, Node> {
107
108	private static final EqualsVisitor SINGLETON = new EqualsVisitor();
109
110	public static boolean equals(final Node n1, final Node n2) {
111		return SINGLETON.nodeEquals(n1, n2);
112	}
113
114	private EqualsVisitor() {
115		// hide constructor
116	}
117
118    /**
119     * Check for equality that can be applied to each kind of node,
120     * to not repeat it in every method we store that here.
121     */
122    private boolean commonNodeEquality(Node n1, Node n2) {
123        if (!nodeEquals(n1.getComment(), n2.getComment())) {
124            return false;
125        }
126		return nodesEquals(n1.getOrphanComments(), n2.getOrphanComments());
127	}
128
129	private <T extends Node> boolean nodesEquals(final List<T> nodes1, final List<T> nodes2) {
130		if (nodes1 == null) {
131			return nodes2 == null;
132		} else if (nodes2 == null) {
133			return false;
134		}
135		if (nodes1.size() != nodes2.size()) {
136			return false;
137		}
138		for (int i = 0; i < nodes1.size(); i++) {
139			if (!nodeEquals(nodes1.get(i), nodes2.get(i))) {
140				return false;
141			}
142		}
143		return true;
144	}
145
146	private <T extends Node> boolean nodeEquals(final T n1, final T n2) {
147		if (n1 == n2) {
148			return true;
149		}
150		if (n1 == null || n2 == null) {
151			return false;
152		}
153		if (n1.getClass() != n2.getClass()) {
154			return false;
155		}
156        if (!commonNodeEquality(n1, n2)){
157            return false;
158        }
159		return n1.accept(this, n2);
160	}
161
162	private boolean objEquals(final Object n1, final Object n2) {
163		if (n1 == n2) {
164			return true;
165		}
166		if (n1 == null || n2 == null) {
167			return false;
168		}
169		return n1.equals(n2);
170	}
171
172	@Override public Boolean visit(final CompilationUnit n1, final Node arg) {
173		final CompilationUnit n2 = (CompilationUnit) arg;
174
175		if (!nodeEquals(n1.getPackage(), n2.getPackage())) {
176			return false;
177		}
178
179		if (!nodesEquals(n1.getImports(), n2.getImports())) {
180			return false;
181		}
182
183		if (!nodesEquals(n1.getTypes(), n2.getTypes())) {
184			return false;
185		}
186
187		if (!nodesEquals(n1.getComments(), n2.getComments())) {
188			return false;
189		}
190
191		return true;
192	}
193
194	@Override public Boolean visit(final PackageDeclaration n1, final Node arg) {
195		final PackageDeclaration n2 = (PackageDeclaration) arg;
196
197		if (!nodeEquals(n1.getName(), n2.getName())) {
198			return false;
199		}
200
201		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
202			return false;
203		}
204
205		return true;
206	}
207
208	@Override public Boolean visit(final ImportDeclaration n1, final Node arg) {
209		final ImportDeclaration n2 = (ImportDeclaration) arg;
210
211		if (!nodeEquals(n1.getName(), n2.getName())) {
212			return false;
213		}
214
215		return true;
216	}
217
218	@Override public Boolean visit(final TypeParameter n1, final Node arg) {
219		final TypeParameter n2 = (TypeParameter) arg;
220
221		if (!objEquals(n1.getName(), n2.getName())) {
222			return false;
223		}
224
225		if (!nodesEquals(n1.getTypeBound(), n2.getTypeBound())) {
226			return false;
227		}
228		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
229			return false;
230		}
231		return true;
232	}
233
234	@Override public Boolean visit(final LineComment n1, final Node arg) {
235		final LineComment n2 = (LineComment) arg;
236
237		if (!objEquals(n1.getContent(), n2.getContent())) {
238			return false;
239		}
240
241        if (!objEquals(n1.getBegin().line, n2.getBegin().line)) {
242      		return false;
243      	}
244
245		return true;
246	}
247
248	@Override public Boolean visit(final BlockComment n1, final Node arg) {
249		final BlockComment n2 = (BlockComment) arg;
250
251		if (!objEquals(n1.getContent(), n2.getContent())) {
252			return false;
253		}
254
255        if (!objEquals(n1.getBegin().line, n2.getBegin().line)) {
256      			return false;
257      	}
258
259		return true;
260	}
261
262	@Override public Boolean visit(final ClassOrInterfaceDeclaration n1, final Node arg) {
263		final ClassOrInterfaceDeclaration n2 = (ClassOrInterfaceDeclaration) arg;
264
265		// javadoc are checked at CompilationUnit
266
267        if (!n1.getModifiers().equals(n2.getModifiers())) {
268			return false;
269		}
270
271		if (n1.isInterface() != n2.isInterface()) {
272			return false;
273		}
274
275		if (!objEquals(n1.getName(), n2.getName())) {
276			return false;
277		}
278
279		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
280			return false;
281		}
282
283		if (!nodesEquals(n1.getTypeParameters(), n2.getTypeParameters())) {
284			return false;
285		}
286
287		if (!nodesEquals(n1.getExtends(), n2.getExtends())) {
288			return false;
289		}
290
291		if (!nodesEquals(n1.getImplements(), n2.getImplements())) {
292			return false;
293		}
294
295		if (!nodesEquals(n1.getMembers(), n2.getMembers())) {
296			return false;
297		}
298
299		return true;
300	}
301
302	@Override public Boolean visit(final EnumDeclaration n1, final Node arg) {
303		final EnumDeclaration n2 = (EnumDeclaration) arg;
304
305		// javadoc are checked at CompilationUnit
306
307        if (!n1.getModifiers().equals(n2.getModifiers())) {
308			return false;
309		}
310
311		if (!objEquals(n1.getName(), n2.getName())) {
312			return false;
313		}
314
315		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
316			return false;
317		}
318
319		if (!nodesEquals(n1.getImplements(), n2.getImplements())) {
320			return false;
321		}
322
323		if (!nodesEquals(n1.getEntries(), n2.getEntries())) {
324			return false;
325		}
326
327		if (!nodesEquals(n1.getMembers(), n2.getMembers())) {
328			return false;
329		}
330
331		return true;
332	}
333
334	@Override public Boolean visit(final EmptyTypeDeclaration n1, final Node arg) {
335		return true;
336	}
337
338	@Override public Boolean visit(final EnumConstantDeclaration n1, final Node arg) {
339		final EnumConstantDeclaration n2 = (EnumConstantDeclaration) arg;
340
341		// javadoc are checked at CompilationUnit
342
343		if (!objEquals(n1.getName(), n2.getName())) {
344			return false;
345		}
346
347		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
348			return false;
349		}
350
351		if (!nodesEquals(n1.getArgs(), n2.getArgs())) {
352			return false;
353		}
354
355		if (!nodesEquals(n1.getClassBody(), n2.getClassBody())) {
356			return false;
357		}
358
359		return true;
360	}
361
362	@Override public Boolean visit(final AnnotationDeclaration n1, final Node arg) {
363		final AnnotationDeclaration n2 = (AnnotationDeclaration) arg;
364
365		// javadoc are checked at CompilationUnit
366
367        if (!n1.getModifiers().equals(n2.getModifiers())) {
368			return false;
369		}
370
371		if (!objEquals(n1.getName(), n2.getName())) {
372			return false;
373		}
374
375		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
376			return false;
377		}
378
379		if (!nodesEquals(n1.getMembers(), n2.getMembers())) {
380			return false;
381		}
382
383		return true;
384	}
385
386	@Override public Boolean visit(final AnnotationMemberDeclaration n1, final Node arg) {
387		final AnnotationMemberDeclaration n2 = (AnnotationMemberDeclaration) arg;
388
389		// javadoc are checked at CompilationUnit
390
391        if (!n1.getModifiers().equals(n2.getModifiers())) {
392			return false;
393		}
394
395		if (!objEquals(n1.getName(), n2.getName())) {
396			return false;
397		}
398
399		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
400			return false;
401		}
402
403		if (!nodeEquals(n1.getDefaultValue(), n2.getDefaultValue())) {
404			return false;
405		}
406
407		if (!nodeEquals(n1.getType(), n2.getType())) {
408			return false;
409		}
410
411		return true;
412	}
413
414	@Override public Boolean visit(final FieldDeclaration n1, final Node arg) {
415		final FieldDeclaration n2 = (FieldDeclaration) arg;
416
417		// javadoc are checked at CompilationUnit
418
419        if (!n1.getModifiers().equals(n2.getModifiers())) {
420			return false;
421		}
422
423		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
424			return false;
425		}
426
427		if (!nodeEquals(n1.getElementType(), n2.getElementType())) {
428			return false;
429		}
430
431		if (!nodesEquals(n1.getVariables(), n2.getVariables())) {
432			return false;
433		}
434
435		if(!nodesEquals(n1.getArrayBracketPairsAfterElementType(), n2.getArrayBracketPairsAfterElementType())){
436			return false;
437		}
438
439		return true;
440	}
441
442	@Override public Boolean visit(final VariableDeclarator n1, final Node arg) {
443		final VariableDeclarator n2 = (VariableDeclarator) arg;
444
445		if (!nodeEquals(n1.getId(), n2.getId())) {
446			return false;
447		}
448
449		if (!nodeEquals(n1.getInit(), n2.getInit())) {
450			return false;
451		}
452
453		return true;
454	}
455
456	@Override public Boolean visit(final VariableDeclaratorId n1, final Node arg) {
457		final VariableDeclaratorId n2 = (VariableDeclaratorId) arg;
458
459		if(!nodesEquals(n1.getArrayBracketPairsAfterId(), n2.getArrayBracketPairsAfterId())){
460			return false;
461		}
462
463		if (!objEquals(n1.getName(), n2.getName())) {
464			return false;
465		}
466
467		return true;
468	}
469
470	@Override public Boolean visit(final ConstructorDeclaration n1, final Node arg) {
471		final ConstructorDeclaration n2 = (ConstructorDeclaration) arg;
472
473		// javadoc are checked at CompilationUnit
474
475        if (!n1.getModifiers().equals(n2.getModifiers())) {
476			return false;
477		}
478
479		if (!objEquals(n1.getName(), n2.getName())) {
480			return false;
481		}
482
483		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
484			return false;
485		}
486
487		if (!nodeEquals(n1.getBody(), n2.getBody())) {
488			return false;
489		}
490
491		if (!nodesEquals(n1.getParameters(), n2.getParameters())) {
492			return false;
493		}
494
495		if (!nodesEquals(n1.getThrows(), n2.getThrows())) {
496			return false;
497		}
498
499		if (!nodesEquals(n1.getTypeParameters(), n2.getTypeParameters())) {
500			return false;
501		}
502
503		return true;
504	}
505
506	@Override public Boolean visit(final MethodDeclaration n1, final Node arg) {
507		final MethodDeclaration n2 = (MethodDeclaration) arg;
508
509		// javadoc are checked at CompilationUnit
510
511        if (!n1.getModifiers().equals(n2.getModifiers())) {
512			return false;
513		}
514
515		if(!nodesEquals(n1.getArrayBracketPairsAfterElementType(), n2.getArrayBracketPairsAfterElementType())){
516			return false;
517		}
518
519		if(!nodesEquals(n1.getArrayBracketPairsAfterParameterList(), n2.getArrayBracketPairsAfterParameterList())){
520			return false;
521		}
522
523		if (!objEquals(n1.getName(), n2.getName())) {
524			return false;
525		}
526
527		if (!nodeEquals(n1.getElementType(), n2.getElementType())) {
528			return false;
529		}
530
531		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
532			return false;
533		}
534
535		if (!nodeEquals(n1.getBody(), n2.getBody())) {
536			return false;
537		}
538
539		if (!nodesEquals(n1.getParameters(), n2.getParameters())) {
540			return false;
541		}
542
543		if (!nodesEquals(n1.getThrows(), n2.getThrows())) {
544			return false;
545		}
546
547		if (!nodesEquals(n1.getTypeParameters(), n2.getTypeParameters())) {
548			return false;
549		}
550		if(n1.isDefault() != n2.isDefault()){
551			return false;
552		}
553		return true;
554	}
555
556	@Override public Boolean visit(final Parameter n1, final Node arg) {
557		final Parameter n2 = (Parameter) arg;
558		if (!nodeEquals(n1.getElementType(), n2.getElementType())) {
559			return false;
560		}
561
562		if(!nodesEquals(n1.getArrayBracketPairsAfterElementType(), n2.getArrayBracketPairsAfterElementType())){
563			return false;
564		}
565
566		if (!n1.getModifiers().equals(n2.getModifiers())) {
567			return false;
568		}
569
570		if (!nodeEquals(n1.getId(), n2.getId())) {
571			return false;
572		}
573
574		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
575			return false;
576		}
577
578		return true;
579	}
580
581	@Override public Boolean visit(final EmptyMemberDeclaration n1, final Node arg) {
582		return true;
583	}
584
585	@Override public Boolean visit(final InitializerDeclaration n1, final Node arg) {
586		final InitializerDeclaration n2 = (InitializerDeclaration) arg;
587
588		if (!nodeEquals(n1.getBlock(), n2.getBlock())) {
589			return false;
590		}
591
592		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
593			return false;
594		}
595
596		return true;
597	}
598
599	@Override public Boolean visit(final JavadocComment n1, final Node arg) {
600		final JavadocComment n2 = (JavadocComment) arg;
601
602		if (!objEquals(n1.getContent(), n2.getContent())) {
603			return false;
604		}
605
606		return true;
607	}
608
609	@Override public Boolean visit(final ClassOrInterfaceType n1, final Node arg) {
610		final ClassOrInterfaceType n2 = (ClassOrInterfaceType) arg;
611
612		if (!objEquals(n1.getName(), n2.getName())) {
613			return false;
614		}
615
616		if (!nodeEquals(n1.getScope(), n2.getScope())) {
617			return false;
618		}
619
620		if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
621			return false;
622		}
623
624		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
625			return false;
626		}
627
628		return true;
629	}
630
631	@Override public Boolean visit(final PrimitiveType n1, final Node arg) {
632		final PrimitiveType n2 = (PrimitiveType) arg;
633
634		if (n1.getType() != n2.getType()) {
635			return false;
636		}
637		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
638			return false;
639		}
640		return true;
641	}
642
643	@Override
644	public Boolean visit(ArrayType n1, Node arg) {
645		final ArrayType n2 = (ArrayType) arg;
646
647		if (!nodeEquals(n1.getComponentType(), n2.getComponentType())) {
648			return false;
649		}
650		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
651			return false;
652		}
653		return true;
654	}
655
656	@Override
657	public Boolean visit(ArrayCreationLevel n1, Node arg) {
658		final ArrayCreationLevel n2 = (ArrayCreationLevel) arg;
659
660		if (!nodeEquals(n1.getDimension(), n2.getDimension())) {
661			return false;
662		}
663		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
664			return false;
665		}
666		return true;
667	}
668
669	@Override public Boolean visit(final IntersectionType n1, final Node arg) {
670        final IntersectionType n2 = (IntersectionType) arg;
671
672		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
673			return false;
674		}
675
676        List<ReferenceType> n1Elements = n1.getElements();
677        List<ReferenceType> n2Elements = n2.getElements();
678
679        if (n1Elements !=null && n2Elements != null) {
680            if(n1Elements.size() != n2Elements.size()){
681                return false;
682            }
683            else{
684                int i = 0;
685                for(ReferenceType aux: n1Elements){
686                    if(aux.accept(this, n2Elements.get(i))) {
687                        return false;
688                    }
689                    i++;
690                }
691            }
692        }  else if (n1Elements != n2Elements){
693            return false;
694        }
695        return true;
696    }
697
698    @Override public Boolean visit(final UnionType n1, final Node arg) {
699        final UnionType n2 = (UnionType) arg;
700
701		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
702			return false;
703		}
704
705        List<ReferenceType> n1Elements = n1.getElements();
706        List<ReferenceType> n2Elements = n2.getElements();
707
708        if (n1Elements !=null && n2Elements != null) {
709            if(n1Elements.size() != n2Elements.size()){
710                return false;
711            }
712            else{
713                int i = 0;
714                for(ReferenceType aux: n1Elements){
715                    if(aux.accept(this, n2Elements.get(i))) {
716                        return false;
717                    }
718                    i++;
719                }
720            }
721        }  else if (n1Elements != n2Elements){
722            return false;
723        }
724        return true;
725    }
726
727	@Override
728	public Boolean visit(VoidType n1, Node arg) {
729		VoidType n2 = (VoidType) arg;
730		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
731			return false;
732		}
733		return true;
734	}
735
736	@Override public Boolean visit(final WildcardType n1, final Node arg) {
737		final WildcardType n2 = (WildcardType) arg;
738
739		if (!nodeEquals(n1.getExtends(), n2.getExtends())) {
740			return false;
741		}
742
743		if (!nodeEquals(n1.getSuper(), n2.getSuper())) {
744			return false;
745		}
746		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
747			return false;
748		}
749		return true;
750	}
751
752	@Override public Boolean visit(final UnknownType n1, final Node arg) {
753		return true;
754	}
755
756	@Override public Boolean visit(final ArrayAccessExpr n1, final Node arg) {
757		final ArrayAccessExpr n2 = (ArrayAccessExpr) arg;
758
759		if (!nodeEquals(n1.getName(), n2.getName())) {
760			return false;
761		}
762
763		if (!nodeEquals(n1.getIndex(), n2.getIndex())) {
764			return false;
765		}
766
767		return true;
768	}
769
770	@Override public Boolean visit(final ArrayCreationExpr n1, final Node arg) {
771		final ArrayCreationExpr n2 = (ArrayCreationExpr) arg;
772
773		if (!nodeEquals(n1.getType(), n2.getType())) {
774			return false;
775		}
776
777		if (!nodesEquals(n1.getLevels(), n2.getLevels())) {
778			return false;
779		}
780
781		if (!nodeEquals(n1.getInitializer(), n2.getInitializer())) {
782			return false;
783		}
784
785		return true;
786	}
787
788	@Override public Boolean visit(final ArrayInitializerExpr n1, final Node arg) {
789		final ArrayInitializerExpr n2 = (ArrayInitializerExpr) arg;
790
791		if (!nodesEquals(n1.getValues(), n2.getValues())) {
792			return false;
793		}
794
795		return true;
796	}
797
798	@Override public Boolean visit(final AssignExpr n1, final Node arg) {
799		final AssignExpr n2 = (AssignExpr) arg;
800
801		if (n1.getOperator() != n2.getOperator()) {
802			return false;
803		}
804
805		if (!nodeEquals(n1.getTarget(), n2.getTarget())) {
806			return false;
807		}
808
809		if (!nodeEquals(n1.getValue(), n2.getValue())) {
810			return false;
811		}
812
813		return true;
814	}
815
816	@Override public Boolean visit(final BinaryExpr n1, final Node arg) {
817		final BinaryExpr n2 = (BinaryExpr) arg;
818
819		if (n1.getOperator() != n2.getOperator()) {
820			return false;
821		}
822
823		if (!nodeEquals(n1.getLeft(), n2.getLeft())) {
824			return false;
825		}
826
827		if (!nodeEquals(n1.getRight(), n2.getRight())) {
828			return false;
829		}
830
831		return true;
832	}
833
834	@Override public Boolean visit(final CastExpr n1, final Node arg) {
835		final CastExpr n2 = (CastExpr) arg;
836
837		if (!nodeEquals(n1.getType(), n2.getType())) {
838			return false;
839		}
840
841		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
842			return false;
843		}
844
845		return true;
846	}
847
848	@Override public Boolean visit(final ClassExpr n1, final Node arg) {
849		final ClassExpr n2 = (ClassExpr) arg;
850
851		if (!nodeEquals(n1.getType(), n2.getType())) {
852			return false;
853		}
854
855		return true;
856	}
857
858	@Override public Boolean visit(final ConditionalExpr n1, final Node arg) {
859		final ConditionalExpr n2 = (ConditionalExpr) arg;
860
861		if (!nodeEquals(n1.getCondition(), n2.getCondition())) {
862			return false;
863		}
864
865		if (!nodeEquals(n1.getThenExpr(), n2.getThenExpr())) {
866			return false;
867		}
868
869		if (!nodeEquals(n1.getElseExpr(), n2.getElseExpr())) {
870			return false;
871		}
872
873		return true;
874	}
875
876	@Override public Boolean visit(final EnclosedExpr n1, final Node arg) {
877		final EnclosedExpr n2 = (EnclosedExpr) arg;
878
879		if (!nodeEquals(n1.getInner(), n2.getInner())) {
880			return false;
881		}
882
883		return true;
884	}
885
886	@Override public Boolean visit(final FieldAccessExpr n1, final Node arg) {
887		final FieldAccessExpr n2 = (FieldAccessExpr) arg;
888
889		if (!nodeEquals(n1.getScope(), n2.getScope())) {
890			return false;
891		}
892
893		if (!objEquals(n1.getField(), n2.getField())) {
894			return false;
895		}
896
897		if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
898			return false;
899		}
900
901		return true;
902	}
903
904	@Override public Boolean visit(final InstanceOfExpr n1, final Node arg) {
905		final InstanceOfExpr n2 = (InstanceOfExpr) arg;
906
907		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
908			return false;
909		}
910
911		if (!nodeEquals(n1.getType(), n2.getType())) {
912			return false;
913		}
914
915		return true;
916	}
917
918	@Override public Boolean visit(final StringLiteralExpr n1, final Node arg) {
919		final StringLiteralExpr n2 = (StringLiteralExpr) arg;
920
921		if (!objEquals(n1.getValue(), n2.getValue())) {
922			return false;
923		}
924
925		return true;
926	}
927
928	@Override public Boolean visit(final IntegerLiteralExpr n1, final Node arg) {
929		final IntegerLiteralExpr n2 = (IntegerLiteralExpr) arg;
930
931		if (!objEquals(n1.getValue(), n2.getValue())) {
932			return false;
933		}
934
935		return true;
936	}
937
938	@Override public Boolean visit(final LongLiteralExpr n1, final Node arg) {
939		final LongLiteralExpr n2 = (LongLiteralExpr) arg;
940
941		if (!objEquals(n1.getValue(), n2.getValue())) {
942			return false;
943		}
944
945		return true;
946	}
947
948	@Override public Boolean visit(final IntegerLiteralMinValueExpr n1, final Node arg) {
949		final IntegerLiteralMinValueExpr n2 = (IntegerLiteralMinValueExpr) arg;
950
951		if (!objEquals(n1.getValue(), n2.getValue())) {
952			return false;
953		}
954
955		return true;
956	}
957
958	@Override public Boolean visit(final LongLiteralMinValueExpr n1, final Node arg) {
959		final LongLiteralMinValueExpr n2 = (LongLiteralMinValueExpr) arg;
960
961		if (!objEquals(n1.getValue(), n2.getValue())) {
962			return false;
963		}
964
965		return true;
966	}
967
968	@Override public Boolean visit(final CharLiteralExpr n1, final Node arg) {
969		final CharLiteralExpr n2 = (CharLiteralExpr) arg;
970
971		if (!objEquals(n1.getValue(), n2.getValue())) {
972			return false;
973		}
974
975		return true;
976	}
977
978	@Override public Boolean visit(final DoubleLiteralExpr n1, final Node arg) {
979		final DoubleLiteralExpr n2 = (DoubleLiteralExpr) arg;
980
981		if (!objEquals(n1.getValue(), n2.getValue())) {
982			return false;
983		}
984
985		return true;
986	}
987
988	@Override public Boolean visit(final BooleanLiteralExpr n1, final Node arg) {
989		final BooleanLiteralExpr n2 = (BooleanLiteralExpr) arg;
990
991		if (n1.getValue() != n2.getValue()) {
992			return false;
993		}
994
995		return true;
996	}
997
998	@Override public Boolean visit(final NullLiteralExpr n1, final Node arg) {
999		return true;
1000	}
1001
1002	@Override public Boolean visit(final MethodCallExpr n1, final Node arg) {
1003		final MethodCallExpr n2 = (MethodCallExpr) arg;
1004
1005		if (!nodeEquals(n1.getScope(), n2.getScope())) {
1006			return false;
1007		}
1008
1009		if (!objEquals(n1.getName(), n2.getName())) {
1010			return false;
1011		}
1012
1013		if (!nodesEquals(n1.getArgs(), n2.getArgs())) {
1014			return false;
1015		}
1016
1017		if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
1018			return false;
1019		}
1020
1021		return true;
1022	}
1023
1024	@Override public Boolean visit(final NameExpr n1, final Node arg) {
1025		final NameExpr n2 = (NameExpr) arg;
1026
1027		if (!objEquals(n1.getName(), n2.getName())) {
1028			return false;
1029		}
1030
1031		return true;
1032	}
1033
1034	@Override public Boolean visit(final ObjectCreationExpr n1, final Node arg) {
1035		final ObjectCreationExpr n2 = (ObjectCreationExpr) arg;
1036
1037		if (!nodeEquals(n1.getScope(), n2.getScope())) {
1038			return false;
1039		}
1040
1041		if (!nodeEquals(n1.getType(), n2.getType())) {
1042			return false;
1043		}
1044
1045		if (!nodesEquals(n1.getAnonymousClassBody(), n2.getAnonymousClassBody())) {
1046			return false;
1047		}
1048
1049		if (!nodesEquals(n1.getArgs(), n2.getArgs())) {
1050			return false;
1051		}
1052
1053		if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
1054			return false;
1055		}
1056
1057		return true;
1058	}
1059
1060	@Override public Boolean visit(final QualifiedNameExpr n1, final Node arg) {
1061		final QualifiedNameExpr n2 = (QualifiedNameExpr) arg;
1062
1063		if (!nodeEquals(n1.getQualifier(), n2.getQualifier())) {
1064			return false;
1065		}
1066
1067		if (!objEquals(n1.getName(), n2.getName())) {
1068			return false;
1069		}
1070
1071		return true;
1072	}
1073
1074	@Override public Boolean visit(final ThisExpr n1, final Node arg) {
1075		final ThisExpr n2 = (ThisExpr) arg;
1076
1077		if (!nodeEquals(n1.getClassExpr(), n2.getClassExpr())) {
1078			return false;
1079		}
1080
1081		return true;
1082	}
1083
1084	@Override public Boolean visit(final SuperExpr n1, final Node arg) {
1085		final SuperExpr n2 = (SuperExpr) arg;
1086
1087		if (!nodeEquals(n1.getClassExpr(), n2.getClassExpr())) {
1088			return false;
1089		}
1090
1091		return true;
1092	}
1093
1094	@Override public Boolean visit(final UnaryExpr n1, final Node arg) {
1095		final UnaryExpr n2 = (UnaryExpr) arg;
1096
1097		if (n1.getOperator() != n2.getOperator()) {
1098			return false;
1099		}
1100
1101		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
1102			return false;
1103		}
1104
1105		return true;
1106	}
1107
1108	@Override public Boolean visit(final VariableDeclarationExpr n1, final Node arg) {
1109		final VariableDeclarationExpr n2 = (VariableDeclarationExpr) arg;
1110
1111        if (!n1.getModifiers().equals(n2.getModifiers())) {
1112			return false;
1113		}
1114
1115		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
1116			return false;
1117		}
1118
1119		if (!nodeEquals(n1.getElementType(), n2.getElementType())) {
1120			return false;
1121		}
1122
1123		if (!nodesEquals(n1.getVariables(), n2.getVariables())) {
1124			return false;
1125		}
1126
1127		if(!nodesEquals(n1.getArrayBracketPairsAfterElementType(), n2.getArrayBracketPairsAfterElementType())){
1128			return false;
1129		}
1130
1131		return true;
1132	}
1133
1134	@Override public Boolean visit(final MarkerAnnotationExpr n1, final Node arg) {
1135		final MarkerAnnotationExpr n2 = (MarkerAnnotationExpr) arg;
1136
1137		if (!nodeEquals(n1.getName(), n2.getName())) {
1138			return false;
1139		}
1140
1141		return true;
1142	}
1143
1144	@Override public Boolean visit(final SingleMemberAnnotationExpr n1, final Node arg) {
1145		final SingleMemberAnnotationExpr n2 = (SingleMemberAnnotationExpr) arg;
1146
1147		if (!nodeEquals(n1.getName(), n2.getName())) {
1148			return false;
1149		}
1150
1151		if (!nodeEquals(n1.getMemberValue(), n2.getMemberValue())) {
1152			return false;
1153		}
1154
1155		return true;
1156	}
1157
1158	@Override public Boolean visit(final NormalAnnotationExpr n1, final Node arg) {
1159		final NormalAnnotationExpr n2 = (NormalAnnotationExpr) arg;
1160
1161		if (!nodeEquals(n1.getName(), n2.getName())) {
1162			return false;
1163		}
1164
1165		if (!nodesEquals(n1.getPairs(), n2.getPairs())) {
1166			return false;
1167		}
1168
1169		return true;
1170	}
1171
1172	@Override public Boolean visit(final MemberValuePair n1, final Node arg) {
1173		final MemberValuePair n2 = (MemberValuePair) arg;
1174
1175		if (!objEquals(n1.getName(), n2.getName())) {
1176			return false;
1177		}
1178
1179		if (!nodeEquals(n1.getValue(), n2.getValue())) {
1180			return false;
1181		}
1182
1183		return true;
1184	}
1185
1186	@Override public Boolean visit(final ExplicitConstructorInvocationStmt n1, final Node arg) {
1187		final ExplicitConstructorInvocationStmt n2 = (ExplicitConstructorInvocationStmt) arg;
1188
1189		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
1190			return false;
1191		}
1192
1193		if (!nodesEquals(n1.getArgs(), n2.getArgs())) {
1194			return false;
1195		}
1196
1197		if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
1198			return false;
1199		}
1200
1201		return true;
1202	}
1203
1204	@Override public Boolean visit(final TypeDeclarationStmt n1, final Node arg) {
1205		final TypeDeclarationStmt n2 = (TypeDeclarationStmt) arg;
1206
1207		if (!nodeEquals(n1.getTypeDeclaration(), n2.getTypeDeclaration())) {
1208			return false;
1209		}
1210
1211		return true;
1212	}
1213
1214	@Override public Boolean visit(final AssertStmt n1, final Node arg) {
1215		final AssertStmt n2 = (AssertStmt) arg;
1216
1217		if (!nodeEquals(n1.getCheck(), n2.getCheck())) {
1218			return false;
1219		}
1220
1221		if (!nodeEquals(n1.getMessage(), n2.getMessage())) {
1222			return false;
1223		}
1224
1225		return true;
1226	}
1227
1228	@Override public Boolean visit(final BlockStmt n1, final Node arg) {
1229		final BlockStmt n2 = (BlockStmt) arg;
1230
1231		if (!nodesEquals(n1.getStmts(), n2.getStmts())) {
1232			return false;
1233		}
1234
1235		return true;
1236	}
1237
1238	@Override public Boolean visit(final LabeledStmt n1, final Node arg) {
1239		final LabeledStmt n2 = (LabeledStmt) arg;
1240
1241		if (!nodeEquals(n1.getStmt(), n2.getStmt())) {
1242			return false;
1243		}
1244
1245		return true;
1246	}
1247
1248	@Override public Boolean visit(final EmptyStmt n1, final Node arg) {
1249		return true;
1250	}
1251
1252	@Override public Boolean visit(final ExpressionStmt n1, final Node arg) {
1253		final ExpressionStmt n2 = (ExpressionStmt) arg;
1254
1255		if (!nodeEquals(n1.getExpression(), n2.getExpression())) {
1256			return false;
1257		}
1258
1259		return true;
1260	}
1261
1262	@Override public Boolean visit(final SwitchStmt n1, final Node arg) {
1263		final SwitchStmt n2 = (SwitchStmt) arg;
1264
1265		if (!nodeEquals(n1.getSelector(), n2.getSelector())) {
1266			return false;
1267		}
1268
1269		if (!nodesEquals(n1.getEntries(), n2.getEntries())) {
1270			return false;
1271		}
1272
1273		return true;
1274	}
1275
1276	@Override public Boolean visit(final SwitchEntryStmt n1, final Node arg) {
1277		final SwitchEntryStmt n2 = (SwitchEntryStmt) arg;
1278
1279		if (!nodeEquals(n1.getLabel(), n2.getLabel())) {
1280			return false;
1281		}
1282
1283		if (!nodesEquals(n1.getStmts(), n2.getStmts())) {
1284			return false;
1285		}
1286
1287		return true;
1288	}
1289
1290	@Override public Boolean visit(final BreakStmt n1, final Node arg) {
1291		final BreakStmt n2 = (BreakStmt) arg;
1292
1293		if (!objEquals(n1.getId(), n2.getId())) {
1294			return false;
1295		}
1296
1297		return true;
1298	}
1299
1300	@Override public Boolean visit(final ReturnStmt n1, final Node arg) {
1301		final ReturnStmt n2 = (ReturnStmt) arg;
1302
1303		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
1304			return false;
1305		}
1306
1307		return true;
1308	}
1309
1310	@Override public Boolean visit(final IfStmt n1, final Node arg) {
1311		final IfStmt n2 = (IfStmt) arg;
1312
1313		if (!nodeEquals(n1.getCondition(), n2.getCondition())) {
1314			return false;
1315		}
1316
1317		if (!nodeEquals(n1.getThenStmt(), n2.getThenStmt())) {
1318			return false;
1319		}
1320
1321		if (!nodeEquals(n1.getElseStmt(), n2.getElseStmt())) {
1322			return false;
1323		}
1324
1325		return true;
1326	}
1327
1328	@Override public Boolean visit(final WhileStmt n1, final Node arg) {
1329		final WhileStmt n2 = (WhileStmt) arg;
1330
1331		if (!nodeEquals(n1.getCondition(), n2.getCondition())) {
1332			return false;
1333		}
1334
1335		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1336			return false;
1337		}
1338
1339		return true;
1340	}
1341
1342	@Override public Boolean visit(final ContinueStmt n1, final Node arg) {
1343		final ContinueStmt n2 = (ContinueStmt) arg;
1344
1345		if (!objEquals(n1.getId(), n2.getId())) {
1346			return false;
1347		}
1348
1349		return true;
1350	}
1351
1352	@Override public Boolean visit(final DoStmt n1, final Node arg) {
1353		final DoStmt n2 = (DoStmt) arg;
1354
1355		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1356			return false;
1357		}
1358
1359		if (!nodeEquals(n1.getCondition(), n2.getCondition())) {
1360			return false;
1361		}
1362
1363		return true;
1364	}
1365
1366	@Override public Boolean visit(final ForeachStmt n1, final Node arg) {
1367		final ForeachStmt n2 = (ForeachStmt) arg;
1368
1369		if (!nodeEquals(n1.getVariable(), n2.getVariable())) {
1370			return false;
1371		}
1372
1373		if (!nodeEquals(n1.getIterable(), n2.getIterable())) {
1374			return false;
1375		}
1376
1377		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1378			return false;
1379		}
1380
1381		return true;
1382	}
1383
1384	@Override public Boolean visit(final ForStmt n1, final Node arg) {
1385		final ForStmt n2 = (ForStmt) arg;
1386
1387		if (!nodesEquals(n1.getInit(), n2.getInit())) {
1388			return false;
1389		}
1390
1391		if (!nodeEquals(n1.getCompare(), n2.getCompare())) {
1392			return false;
1393		}
1394
1395		if (!nodesEquals(n1.getUpdate(), n2.getUpdate())) {
1396			return false;
1397		}
1398
1399		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1400			return false;
1401		}
1402
1403		return true;
1404	}
1405
1406	@Override public Boolean visit(final ThrowStmt n1, final Node arg) {
1407		final ThrowStmt n2 = (ThrowStmt) arg;
1408
1409		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
1410			return false;
1411		}
1412
1413		return true;
1414	}
1415
1416	@Override public Boolean visit(final SynchronizedStmt n1, final Node arg) {
1417		final SynchronizedStmt n2 = (SynchronizedStmt) arg;
1418
1419		if (!nodeEquals(n1.getExpr(), n2.getExpr())) {
1420			return false;
1421		}
1422
1423		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1424			return false;
1425		}
1426
1427		return true;
1428	}
1429
1430	@Override public Boolean visit(final TryStmt n1, final Node arg) {
1431		final TryStmt n2 = (TryStmt) arg;
1432
1433		if (!nodeEquals(n1.getTryBlock(), n2.getTryBlock())) {
1434			return false;
1435		}
1436
1437		if (!nodesEquals(n1.getCatchs(), n2.getCatchs())) {
1438			return false;
1439		}
1440
1441		if(!nodesEquals(n1.getResources(), n2.getResources())) {
1442			return false;
1443		}
1444
1445		if (!nodeEquals(n1.getFinallyBlock(), n2.getFinallyBlock())) {
1446			return false;
1447		}
1448
1449		return true;
1450	}
1451
1452	@Override public Boolean visit(final CatchClause n1, final Node arg) {
1453		final CatchClause n2 = (CatchClause) arg;
1454
1455		if (!nodeEquals(n1.getParam(), n2.getParam())) {
1456			return false;
1457		}
1458
1459		if (!nodeEquals(n1.getBody(), n2.getBody())) {
1460			return false;
1461		}
1462
1463		return true;
1464	}
1465
1466    @Override
1467    public Boolean visit(LambdaExpr n1, Node arg) {
1468        LambdaExpr n2 = (LambdaExpr) arg;
1469        if (!nodesEquals(n1.getParameters(), n2.getParameters())) {
1470            return false;
1471        }
1472        if(n1.isParametersEnclosed() != n2.isParametersEnclosed()){
1473            return false;
1474        }
1475        if (!nodeEquals(n1.getBody(), n2.getBody())) {
1476            return false;
1477        }
1478        return true;
1479    }
1480
1481    @Override
1482    public Boolean visit(MethodReferenceExpr n1, Node arg) {
1483        MethodReferenceExpr n2 = (MethodReferenceExpr) arg;
1484        if (!nodeEquals(n1.getScope(), n2.getScope())) {
1485            return false;
1486        }
1487	    if (!nodesEquals(n1.getTypeArguments(), n2.getTypeArguments())) {
1488            return false;
1489        }
1490        if (!objEquals(n1.getIdentifier(), n2.getIdentifier())) {
1491            return false;
1492        }
1493        return true;
1494    }
1495
1496    @Override
1497    public Boolean visit(TypeExpr n, Node arg) {
1498        TypeExpr n2 = (TypeExpr) arg;
1499        if (!nodeEquals(n.getType(), n2.getType())) {
1500            return false;
1501        }
1502        return true;
1503    }
1504
1505	@Override
1506	public Boolean visit(ArrayBracketPair n1, Node arg) {
1507		ArrayBracketPair n2 = (ArrayBracketPair) arg;
1508		if (!nodesEquals(n1.getAnnotations(), n2.getAnnotations())) {
1509			return false;
1510		}
1511
1512		return true;
1513	}
1514}
1515