package org.revapi.java.checks.common; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; import org.revapi.Difference; import org.revapi.java.spi.CheckBase; import org.revapi.java.spi.Code; import org.revapi.java.spi.JavaModelElement; import org.revapi.java.spi.Util; /** * @author Lukas Krejci * @since 0.11.0 */ public abstract class MovedInHierarchy extends CheckBase { private final Code moveUp; private final Code moveDown; protected MovedInHierarchy(Code moveUp, Code moveDown) { this.moveUp = moveUp; this.moveDown = moveDown; } protected void doVisit(@Nullable JavaModelElement oldEl, @Nullable JavaModelElement newEl) { if (oldEl == null || newEl == null) { return; } if (oldEl.isInherited() == newEl.isInherited()) { return; } if (!isBothAccessible(oldEl, newEl)) { return; } String oldType = Util.toUniqueString(oldEl.getModelRepresentation()); String newType = Util.toUniqueString(newEl.getModelRepresentation()); if (oldType.equals(newType)) { pushActive(oldEl, newEl); } } @Nullable @Override protected List<Difference> doEnd() { ActiveElements<JavaModelElement> els = popIfActive(); if (els == null) { return null; } String oldType = Util.toHumanReadableString(els.oldElement.getDeclaringElement().getEnclosingElement().asType()); String newType = Util.toHumanReadableString(els.newElement.getDeclaringElement().getEnclosingElement().asType()); //we know that oldEl.isInherited() != newEl.isInherited(), so it's enough to just check for the old Code code = els.oldElement.isInherited() ? moveDown : moveUp; return Collections.singletonList(createDifference(code, Code.attachmentsFor(els.oldElement, els.newElement, "oldClass", oldType, "newClass", newType))); } }