| package org.checkerframework.checker.index; |
| |
| import com.sun.source.tree.ExpressionTree; |
| import com.sun.source.tree.MemberSelectTree; |
| import com.sun.source.tree.MethodInvocationTree; |
| import com.sun.source.tree.Tree; |
| import javax.annotation.processing.ProcessingEnvironment; |
| import javax.lang.model.type.TypeKind; |
| import javax.lang.model.type.TypeMirror; |
| import org.checkerframework.javacutil.TreeUtils; |
| import org.checkerframework.javacutil.TypesUtils; |
| |
| /** A collection of utility functions used by several Index Checker subcheckers. */ |
| public class IndexUtil { |
| /** Determines whether the type is a sequence supported by this checker. */ |
| public static boolean isSequenceType(TypeMirror type) { |
| return type.getKind() == TypeKind.ARRAY || TypesUtils.isString(type); |
| } |
| |
| /** Gets a sequence tree for a length access tree, or null if it is not a length access. */ |
| public static ExpressionTree getLengthSequenceTree( |
| Tree lengthTree, IndexMethodIdentifier imf, ProcessingEnvironment processingEnv) { |
| if (TreeUtils.isArrayLengthAccess(lengthTree)) { |
| return ((MemberSelectTree) lengthTree).getExpression(); |
| } else if (imf.isLengthOfMethodInvocation(lengthTree)) { |
| return TreeUtils.getReceiverTree((MethodInvocationTree) lengthTree); |
| } |
| |
| return null; |
| } |
| } |