001package org.junit.runners.model;
002
003import java.lang.reflect.Modifier;
004import java.util.List;
005
006/**
007 * Parent class for {@link FrameworkField} and {@link FrameworkMethod}
008 *
009 * @since 4.7
010 */
011public abstract class FrameworkMember<T extends FrameworkMember<T>> implements
012        Annotatable {
013    abstract boolean isShadowedBy(T otherMember);
014
015    T handlePossibleBridgeMethod(List<T> members) {
016        for (int i = members.size() - 1; i >=0; i--) {
017            T otherMember = members.get(i);
018            if (isShadowedBy(otherMember)) {
019                if (otherMember.isBridgeMethod()) {
020                    /*
021                     *  We need to return the previously-encountered bridge method
022                     *  because JUnit won't be able to call the parent method,
023                     *  because the parent class isn't public.
024                     */
025                    members.remove(i);
026                    return otherMember;
027                }
028                // We found a shadowed member that isn't a bridge method. Ignore it.
029                return null;
030            }
031        }
032        // No shadow or bridge method found. The caller should add *this* member.
033        return (T) this;
034    }
035
036    abstract boolean isBridgeMethod();
037
038    protected abstract int getModifiers();
039
040    /**
041     * Returns true if this member is static, false if not.
042     */
043    public boolean isStatic() {
044        return Modifier.isStatic(getModifiers());
045    }
046
047    /**
048     * Returns true if this member is public, false if not.
049     */
050    public boolean isPublic() {
051        return Modifier.isPublic(getModifiers());
052    }
053
054    public abstract String getName();
055
056    public abstract Class<?> getType();
057
058    public abstract Class<?> getDeclaringClass();
059}