/**
* Copyright (C) 2006-2017 INRIA and contributors
* Spoon - http://spoon.gforge.inria.fr/
*
* This software is governed by the CeCILL-C License under French law and
* abiding by the rules of distribution of free software. You can use, modify
* and/or redistribute the software under the terms of the CeCILL-C license as
* circulated by CEA, CNRS and INRIA at http://www.cecill.info.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
package spoon.support.visitor.equals;
import spoon.reflect.code.CtBinaryOperator;
import spoon.reflect.code.CtBreak;
import spoon.reflect.code.CtContinue;
import spoon.reflect.code.CtLiteral;
import spoon.reflect.code.CtOperatorAssignment;
import spoon.reflect.code.CtStatement;
import spoon.reflect.code.CtUnaryOperator;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtModifiable;
import spoon.reflect.declaration.CtNamedElement;
import spoon.reflect.declaration.CtParameter;
import spoon.reflect.reference.CtArrayTypeReference;
import spoon.reflect.reference.CtExecutableReference;
import spoon.reflect.reference.CtReference;
import spoon.reflect.visitor.CtInheritanceScanner;
public class EqualsChecker extends CtInheritanceScanner {
private CtElement other;
private boolean isNotEqual;
public void setOther(CtElement other) {
this.other = other;
}
public boolean isNotEqual() {
return isNotEqual;
}
@Override
public void scanCtNamedElement(CtNamedElement e) {
final CtNamedElement peek = (CtNamedElement) this.other;
if (!e.getSimpleName().equals(peek.getSimpleName())) {
isNotEqual = true;
return;
}
super.scanCtNamedElement(e);
}
@Override
public void scanCtReference(CtReference reference) {
final CtReference peek = (CtReference) this.other;
if (!reference.getSimpleName().equals(peek.getSimpleName())) {
isNotEqual = true;
return;
}
super.scanCtReference(reference);
}
@Override
public void scanCtStatement(CtStatement s) {
final CtStatement peek = (CtStatement) this.other;
final String leftLabel = s.getLabel();
final String rightLabel = peek.getLabel();
if (leftLabel == null && rightLabel == null) {
super.scanCtStatement(s);
return;
}
if (leftLabel == null || !leftLabel.equals(rightLabel)) {
isNotEqual = true;
return;
}
super.scanCtStatement(s);
}
@Override
public void scanCtModifiable(CtModifiable m) {
final CtModifiable peek = (CtModifiable) this.other;
if (m.getVisibility() == null) {
if (peek.getVisibility() != null) {
isNotEqual = true;
return;
}
} else if (peek.getVisibility() == null) {
isNotEqual = true;
return;
} else if (!m.getVisibility().equals(peek.getVisibility())) {
isNotEqual = true;
return;
}
if (m.getModifiers().size() != peek.getModifiers().size()) {
isNotEqual = true;
return;
}
if (!m.getModifiers().containsAll(peek.getModifiers())) {
isNotEqual = true;
return;
}
super.scanCtModifiable(m);
}
@Override
public <T, A extends T> void visitCtOperatorAssignment(CtOperatorAssignment<T, A> assignment) {
final CtOperatorAssignment peek = (CtOperatorAssignment) this.other;
if (assignment.getKind() == null) {
if (peek.getKind() != null) {
isNotEqual = true;
return;
}
} else if (peek.getKind() == null) {
isNotEqual = true;
return;
} else if (!assignment.getKind().equals(peek.getKind())) {
isNotEqual = true;
return;
}
super.visitCtOperatorAssignment(assignment);
}
@Override
public <T> void visitCtBinaryOperator(CtBinaryOperator<T> e) {
final CtBinaryOperator peek = (CtBinaryOperator) this.other;
if (e.getKind() == null) {
if (peek.getKind() != null) {
isNotEqual = true;
return;
}
} else if (peek.getKind() == null) {
isNotEqual = true;
return;
} else if (!e.getKind().equals(peek.getKind())) {
isNotEqual = true;
return;
}
super.visitCtBinaryOperator(e);
}
@Override
public <T> void visitCtUnaryOperator(CtUnaryOperator<T> e) {
final CtUnaryOperator peek = (CtUnaryOperator) this.other;
if (e.getKind() == null) {
if (peek.getKind() != null) {
isNotEqual = true;
return;
}
} else if (peek.getKind() == null) {
isNotEqual = true;
return;
} else if (!e.getKind().equals(peek.getKind())) {
isNotEqual = true;
return;
}
super.visitCtUnaryOperator(e);
}
@Override
public <T> void visitCtArrayTypeReference(CtArrayTypeReference<T> e) {
final CtArrayTypeReference peek = (CtArrayTypeReference) this.other;
if (e.getDimensionCount() != peek.getDimensionCount()) {
isNotEqual = true;
return;
}
super.visitCtArrayTypeReference(e);
}
@Override
public void visitCtBreak(CtBreak e) {
final CtBreak peek = (CtBreak) this.other;
if (e.getTargetLabel() == null) {
if (peek.getTargetLabel() != null) {
isNotEqual = true;
return;
}
} else if (peek.getTargetLabel() == null) {
isNotEqual = true;
return;
} else if (!e.getTargetLabel().equals(peek.getTargetLabel())) {
isNotEqual = true;
return;
}
super.visitCtBreak(e);
}
@Override
public void visitCtContinue(CtContinue e) {
final CtContinue peek = (CtContinue) this.other;
if (e.getTargetLabel() == null) {
if (peek.getTargetLabel() != null) {
isNotEqual = true;
return;
}
} else if (peek.getTargetLabel() == null) {
isNotEqual = true;
return;
} else if (!e.getTargetLabel().equals(peek.getTargetLabel())) {
isNotEqual = true;
return;
}
super.visitCtContinue(e);
}
@Override
public <T> void visitCtExecutableReference(CtExecutableReference<T> e) {
final CtExecutableReference peek = (CtExecutableReference) this.other;
if (e.isConstructor() != peek.isConstructor()) {
isNotEqual = true;
return;
}
super.visitCtExecutableReference(e);
}
@Override
public <T> void visitCtMethod(CtMethod<T> e) {
final CtMethod peek = (CtMethod) this.other;
if (e.isDefaultMethod() != peek.isDefaultMethod()) {
isNotEqual = true;
return;
}
super.visitCtMethod(e);
}
@Override
public <T> void visitCtParameter(CtParameter<T> e) {
final CtParameter peek = (CtParameter) this.other;
if (e.isVarArgs() != peek.isVarArgs()) {
isNotEqual = true;
return;
}
super.visitCtParameter(e);
}
@Override
public <T> void visitCtLiteral(CtLiteral<T> e) {
final CtLiteral peek = (CtLiteral) this.other;
if (e.getValue() == null) {
if (peek.getValue() != null) {
isNotEqual = true;
return;
}
} else if (peek.getValue() == null) {
isNotEqual = true;
return;
} else if (!e.getValue().equals(peek.getValue())) {
isNotEqual = true;
return;
}
super.visitCtLiteral(e);
}
}