package org.checkerframework.framework.type; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.type.TypeKind; import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedArrayType; import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedExecutableType; /** * SyntheticArrays exists solely to fix AnnotatedTypeMirrors that need to be adapted from Array type * to a specific kind of array. There are no classes for arrays. Instead, for each type of array * (e.g. String[]) the compiler/JVM creates a synthetic type for them. */ public class SyntheticArrays { /** * @param type a type with a method/field of elem * @param elem an element which is a member of type * @return true if this combination of type/elem represents an array.clone. */ public static boolean isArrayClone(final AnnotatedTypeMirror type, final Element elem) { return type.getKind() == TypeKind.ARRAY && elem.getKind() == ElementKind.METHOD && elem.getSimpleName().contentEquals("clone"); } /** * @param methodElem identifies a method that should have an AnnotatedArrayType as its return * type * @param newReturnType identifies a type that should replace methodElem's return type * @return the annotated type of methodElem with its return type replaced by newReturnType */ public static AnnotatedExecutableType replaceReturnType( final Element methodElem, final AnnotatedArrayType newReturnType) { final AnnotatedExecutableType method = (AnnotatedExecutableType) newReturnType.atypeFactory.getAnnotatedType(methodElem); method.returnType = newReturnType; return method; } }