blob: 821ae5c4947130ed16f718433caec57ebb9cc262 [file] [log] [blame]
package org.checkerframework.framework.util.element;
import com.sun.tools.javac.code.Attribute;
import java.util.List;
import java.util.Map;
import javax.lang.model.element.Element;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
/**
* Some Elements are members of a list (formal method parameters and type parameters). This class
* ensures that the targeted annotations passed by handleTargeted -- see {@link
* TargetedElementAnnotationApplier} -- only include those with a position that matches the index
* returned by getElementIndex.
*/
abstract class IndexedElementAnnotationApplier extends TargetedElementAnnotationApplier {
protected IndexedElementAnnotationApplier(AnnotatedTypeMirror type, Element element) {
super(type, element);
}
/** The index of element in the list of elements that contains it. */
public abstract int getElementIndex();
/**
* A TypeAnnotationPosition has a number of different indexes (type_index, bound_index,
* param_index) Return the index we are interested in. If offsetting needs to be done it should be
* done in getElementIndex not here. (see ElementAnnotationUtils.getBoundIndexOffset )
*
* @param anno an annotation we might wish to apply
* @return the index value this applier compares against the getElementIndex
*/
public abstract int getTypeCompoundIndex(final Attribute.TypeCompound anno);
@Override
protected Map<TargetClass, List<Attribute.TypeCompound>> sift(
Iterable<Attribute.TypeCompound> typeCompounds) {
final Map<TargetClass, List<Attribute.TypeCompound>> targetClassToAnnos =
super.sift(typeCompounds);
final List<Attribute.TypeCompound> targeted = targetClassToAnnos.get(TargetClass.TARGETED);
final List<Attribute.TypeCompound> valid = targetClassToAnnos.get(TargetClass.VALID);
final int paramIndex = getElementIndex();
// filter out annotations in targeted that don't have the correct parameter index. (i.e the
// one's that are on the same method but don't pertain to the parameter element being
// processed, see class comments ). Place these annotations into the valid list.
int i = 0;
while (i < targeted.size()) {
if (getTypeCompoundIndex(targeted.get(i)) != paramIndex) {
valid.add(targeted.remove(i));
} else {
++i;
}
}
return targetClassToAnnos;
}
}