1 /* 2 * Copyright (C) 2007-2010 Jlio 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 22 package com.github.javaparser.ast.visitor; 23 24 import java.util.List; 25 26 import com.github.javaparser.ast.*; 27 import com.github.javaparser.ast.type.TypeParameter; 28 import com.github.javaparser.ast.body.AnnotationDeclaration; 29 import com.github.javaparser.ast.body.AnnotationMemberDeclaration; 30 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 31 import com.github.javaparser.ast.body.ConstructorDeclaration; 32 import com.github.javaparser.ast.body.EmptyMemberDeclaration; 33 import com.github.javaparser.ast.body.EmptyTypeDeclaration; 34 import com.github.javaparser.ast.body.EnumConstantDeclaration; 35 import com.github.javaparser.ast.body.EnumDeclaration; 36 import com.github.javaparser.ast.body.FieldDeclaration; 37 import com.github.javaparser.ast.body.InitializerDeclaration; 38 import com.github.javaparser.ast.body.MethodDeclaration; 39 import com.github.javaparser.ast.body.Parameter; 40 import com.github.javaparser.ast.body.VariableDeclarator; 41 import com.github.javaparser.ast.body.VariableDeclaratorId; 42 import com.github.javaparser.ast.comments.BlockComment; 43 import com.github.javaparser.ast.comments.JavadocComment; 44 import com.github.javaparser.ast.comments.LineComment; 45 import com.github.javaparser.ast.expr.ArrayAccessExpr; 46 import com.github.javaparser.ast.expr.ArrayCreationExpr; 47 import com.github.javaparser.ast.expr.ArrayInitializerExpr; 48 import com.github.javaparser.ast.expr.AssignExpr; 49 import com.github.javaparser.ast.expr.BinaryExpr; 50 import com.github.javaparser.ast.expr.BooleanLiteralExpr; 51 import com.github.javaparser.ast.expr.CastExpr; 52 import com.github.javaparser.ast.expr.CharLiteralExpr; 53 import com.github.javaparser.ast.expr.ClassExpr; 54 import com.github.javaparser.ast.expr.ConditionalExpr; 55 import com.github.javaparser.ast.expr.DoubleLiteralExpr; 56 import com.github.javaparser.ast.expr.EnclosedExpr; 57 import com.github.javaparser.ast.expr.FieldAccessExpr; 58 import com.github.javaparser.ast.expr.InstanceOfExpr; 59 import com.github.javaparser.ast.expr.IntegerLiteralExpr; 60 import com.github.javaparser.ast.expr.IntegerLiteralMinValueExpr; 61 import com.github.javaparser.ast.expr.LambdaExpr; 62 import com.github.javaparser.ast.expr.LongLiteralExpr; 63 import com.github.javaparser.ast.expr.LongLiteralMinValueExpr; 64 import com.github.javaparser.ast.expr.MarkerAnnotationExpr; 65 import com.github.javaparser.ast.expr.MemberValuePair; 66 import com.github.javaparser.ast.expr.MethodCallExpr; 67 import com.github.javaparser.ast.expr.MethodReferenceExpr; 68 import com.github.javaparser.ast.expr.NameExpr; 69 import com.github.javaparser.ast.expr.NormalAnnotationExpr; 70 import com.github.javaparser.ast.expr.NullLiteralExpr; 71 import com.github.javaparser.ast.expr.ObjectCreationExpr; 72 import com.github.javaparser.ast.expr.QualifiedNameExpr; 73 import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr; 74 import com.github.javaparser.ast.expr.StringLiteralExpr; 75 import com.github.javaparser.ast.expr.SuperExpr; 76 import com.github.javaparser.ast.expr.ThisExpr; 77 import com.github.javaparser.ast.expr.TypeExpr; 78 import com.github.javaparser.ast.expr.UnaryExpr; 79 import com.github.javaparser.ast.expr.VariableDeclarationExpr; 80 import com.github.javaparser.ast.stmt.AssertStmt; 81 import com.github.javaparser.ast.stmt.BlockStmt; 82 import com.github.javaparser.ast.stmt.BreakStmt; 83 import com.github.javaparser.ast.stmt.CatchClause; 84 import com.github.javaparser.ast.stmt.ContinueStmt; 85 import com.github.javaparser.ast.stmt.DoStmt; 86 import com.github.javaparser.ast.stmt.EmptyStmt; 87 import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt; 88 import com.github.javaparser.ast.stmt.ExpressionStmt; 89 import com.github.javaparser.ast.stmt.ForStmt; 90 import com.github.javaparser.ast.stmt.ForeachStmt; 91 import com.github.javaparser.ast.stmt.IfStmt; 92 import com.github.javaparser.ast.stmt.LabeledStmt; 93 import com.github.javaparser.ast.stmt.ReturnStmt; 94 import com.github.javaparser.ast.stmt.SwitchEntryStmt; 95 import com.github.javaparser.ast.stmt.SwitchStmt; 96 import com.github.javaparser.ast.stmt.SynchronizedStmt; 97 import com.github.javaparser.ast.stmt.ThrowStmt; 98 import com.github.javaparser.ast.stmt.TryStmt; 99 import com.github.javaparser.ast.stmt.TypeDeclarationStmt; 100 import com.github.javaparser.ast.stmt.WhileStmt; 101 import com.github.javaparser.ast.type.*; 102 103 /** 104 * @author Julio Vilmar Gesser 105 */ 106 public 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