diff --git a/framework/src/main/java/org/checkerframework/common/value/ValueVisitor.java b/framework/src/main/java/org/checkerframework/common/value/ValueVisitor.java index 6aee2b3424d..a17d0fb0f7d 100644 --- a/framework/src/main/java/org/checkerframework/common/value/ValueVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/value/ValueVisitor.java @@ -2,6 +2,7 @@ import com.sun.source.tree.AnnotationTree; import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.MethodInvocationTree; import com.sun.source.tree.MethodTree; import com.sun.source.tree.Tree; import com.sun.source.tree.Tree.Kind; @@ -76,6 +77,18 @@ protected void commonAssignmentCheck( getTypeFactory().createIntRangeAnnotation(Range.CHAR_EVERYTHING)); } + if (valueTree.getKind() == Kind.METHOD_INVOCATION + && TreeUtils.isArrayscopyOfMethodInvocation((MethodInvocationTree) valueTree) + && valueType.getKind() == TypeKind.ARRAY) { + List args = ((MethodInvocationTree) valueTree).getArguments(); + AnnotatedTypeMirror arrType = atypeFactory.getAnnotatedType(args.get(0)); + if (args.size() == 2) { + if (TreeUtils.isArrayLengthAccess(args.get(1))) { + valueType = arrType; + } + } + } + super.commonAssignmentCheck(varType, valueType, valueTree, errorKey, extraArgs); } diff --git a/javacutil/src/main/java/org/checkerframework/javacutil/TreeUtils.java b/javacutil/src/main/java/org/checkerframework/javacutil/TreeUtils.java index 9093d746053..063aad157ac 100644 --- a/javacutil/src/main/java/org/checkerframework/javacutil/TreeUtils.java +++ b/javacutil/src/main/java/org/checkerframework/javacutil/TreeUtils.java @@ -1273,6 +1273,27 @@ public static boolean isAnonymousConstructor(final MethodTree method) { return false; } + /** + * Determines if the tree is a call to Arrays.copyOf() + * + * @param tree tree to check + * @return true if the given tree is a call to Arrays.copyOf() method + */ + public static boolean isArrayscopyOfMethodInvocation(MethodInvocationTree tree) { + if (tree.getMethodSelect().getKind() != Kind.MEMBER_SELECT) { + return false; + } + + MemberSelectTree memberSelectTree = (MemberSelectTree) (tree.getMethodSelect()); + + if (memberSelectTree.getExpression().toString().equals("Arrays") + && getMethodName(memberSelectTree).equals("copyOf")) { + return true; + } + + return false; + } + /** * Converts the given AnnotationTrees to AnnotationMirrors. *