Search in sources :

Example 21 with TypeParameterElement

use of javax.lang.model.element.TypeParameterElement in project ig-json-parser by Instagram.

the class TypeUtils method getCollectionParameterizedType.

/**
   * If {@code typeMirror} represents a list type ({@link java.util.List}), attempt to divine the
   * type of the contents.
   *
   * Returns null if {@code typeMirror} does not represent a list type or if we cannot divine the
   * type of the contents.
   */
public TypeMirror getCollectionParameterizedType(TypeMirror typeMirror) {
    if (!(typeMirror instanceof DeclaredType)) {
        return null;
    }
    DeclaredType declaredType = (DeclaredType) typeMirror;
    Element element = declaredType.asElement();
    if (!(element instanceof TypeElement)) {
        return null;
    }
    TypeElement typeElement = (TypeElement) element;
    List<? extends TypeParameterElement> typeParameterElements = typeElement.getTypeParameters();
    List<TypeMirror> typeArguments = (List<TypeMirror>) declaredType.getTypeArguments();
    if (JAVA_UTIL_QUEUE.equals(getCanonicalTypeName(declaredType)) || JAVA_UTIL_LIST.equals(getCanonicalTypeName(declaredType)) || JAVA_UTIL_ARRAYLIST.equals(getCanonicalTypeName(declaredType)) || JAVA_UTIL_SET.equals(getCanonicalTypeName(declaredType))) {
        // sanity check.
        if (typeParameterElements.size() != 1) {
            throw new IllegalStateException(String.format("%s is not expected generic type", declaredType));
        }
        return typeArguments.get(0);
    } else if (JAVA_UTIL_HASHMAP.equals(getCanonicalTypeName(declaredType))) {
        // sanity check.
        if (typeParameterElements.size() != 2) {
            throw new IllegalStateException(String.format("%s is not expected generic type", declaredType));
        }
        TypeMirror keyType = typeArguments.get(0);
        TypeMirror valueType = typeArguments.get(1);
        if (!JAVA_LANG_STRING.equals(keyType.toString())) {
            throw new IllegalStateException("Only String keys are supported for map types");
        }
        return valueType;
    }
    return null;
}
Also used : TypeMirror(javax.lang.model.type.TypeMirror) TypeElement(javax.lang.model.element.TypeElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) TypeParameterElement(javax.lang.model.element.TypeParameterElement) List(java.util.List) DeclaredType(javax.lang.model.type.DeclaredType)

Example 22 with TypeParameterElement

use of javax.lang.model.element.TypeParameterElement in project androidannotations by androidannotations.

the class APTCodeModelHelper method overrideAnnotatedMethod.

public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, GeneratedClassHolder holder) {
    TypeMirror annotatedClass = holder.getAnnotatedElement().asType();
    DeclaredType baseClass = (DeclaredType) executableElement.getEnclosingElement().asType();
    Types typeUtils = environment.getProcessingEnvironment().getTypeUtils();
    Map<String, TypeMirror> actualTypes = getActualTypes(typeUtils, baseClass, annotatedClass);
    Map<String, List<AbstractJClass>> methodTypes = new LinkedHashMap<>();
    for (TypeParameterElement typeParameter : executableElement.getTypeParameters()) {
        List<? extends TypeMirror> bounds = typeParameter.getBounds();
        List<AbstractJClass> addedBounds = typeBoundsToJClass(bounds, actualTypes);
        methodTypes.put(typeParameter.toString(), addedBounds);
    }
    actualTypes.keySet().removeAll(methodTypes.keySet());
    JMethod existingMethod = findAlreadyGeneratedMethod(executableElement, holder);
    if (existingMethod != null) {
        return existingMethod;
    }
    String methodName = executableElement.getSimpleName().toString();
    AbstractJClass returnType = typeMirrorToJClass(executableElement.getReturnType(), actualTypes);
    int modifier = elementVisibilityModifierToJMod(executableElement);
    JMethod method = holder.getGeneratedClass().method(modifier, returnType, methodName);
    copyNonAAAnnotations(method, executableElement.getAnnotationMirrors());
    if (!hasAnnotation(method, Override.class)) {
        method.annotate(Override.class);
    }
    for (Map.Entry<String, List<AbstractJClass>> typeDeclaration : methodTypes.entrySet()) {
        List<AbstractJClass> bounds = typeDeclaration.getValue();
        addTypeBounds(method, bounds, typeDeclaration.getKey());
    }
    int i = 0;
    for (VariableElement parameter : executableElement.getParameters()) {
        boolean varParam = i == executableElement.getParameters().size() - 1 && executableElement.isVarArgs();
        addParamToMethod(method, parameter, JMod.FINAL, actualTypes, varParam);
        i++;
    }
    for (TypeMirror superThrownType : executableElement.getThrownTypes()) {
        AbstractJClass thrownType = typeMirrorToJClass(superThrownType, actualTypes);
        method._throws(thrownType);
    }
    callSuperMethod(method, holder, method.body());
    return method;
}
Also used : Types(javax.lang.model.util.Types) AbstractJClass(com.helger.jcodemodel.AbstractJClass) VariableElement(javax.lang.model.element.VariableElement) LinkedHashMap(java.util.LinkedHashMap) TypeParameterElement(javax.lang.model.element.TypeParameterElement) TypeMirror(javax.lang.model.type.TypeMirror) List(java.util.List) ArrayList(java.util.ArrayList) JMethod(com.helger.jcodemodel.JMethod) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) DeclaredType(javax.lang.model.type.DeclaredType)

Example 23 with TypeParameterElement

use of javax.lang.model.element.TypeParameterElement in project buck by facebook.

the class TreeBackedElements method enterElement.

public TreeBackedElement enterElement(Element underlyingElement) {
    TreeBackedElement result = treeBackedElements.get(underlyingElement);
    if (result != null) {
        return result;
    }
    ElementKind kind = underlyingElement.getKind();
    switch(kind) {
        case PACKAGE:
            result = newTreeBackedPackage((PackageElement) underlyingElement);
            break;
        case ANNOTATION_TYPE:
        case CLASS:
        case ENUM:
        case INTERFACE:
            result = newTreeBackedType((TypeElement) underlyingElement);
            break;
        case TYPE_PARAMETER:
            result = newTreeBackedTypeParameter((TypeParameterElement) underlyingElement);
            break;
        case ENUM_CONSTANT:
        case FIELD:
        case PARAMETER:
            result = newTreeBackedVariable((VariableElement) underlyingElement);
            break;
        case CONSTRUCTOR:
        case METHOD:
            result = newTreeBackedExecutable((ExecutableElement) underlyingElement);
            break;
        // $CASES-OMITTED$
        default:
            throw new UnsupportedOperationException(String.format("Element kind %s NYI", kind));
    }
    treeBackedElements.put(underlyingElement, result);
    return result;
}
Also used : ElementKind(javax.lang.model.element.ElementKind) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) PackageElement(javax.lang.model.element.PackageElement) VariableElement(javax.lang.model.element.VariableElement) TypeParameterElement(javax.lang.model.element.TypeParameterElement)

Example 24 with TypeParameterElement

use of javax.lang.model.element.TypeParameterElement in project buck by facebook.

the class StandaloneTypeVariableTest method testAsElement.

@Test
public void testAsElement() throws IOException {
    compile("class Foo<T> { }");
    TypeParameterElement tElement = elements.getTypeElement("Foo").getTypeParameters().get(0);
    TypeVariable tVar = (TypeVariable) tElement.asType();
    assertSame(tElement, tVar.asElement());
}
Also used : TypeVariable(javax.lang.model.type.TypeVariable) TypeParameterElement(javax.lang.model.element.TypeParameterElement) Test(org.junit.Test)

Example 25 with TypeParameterElement

use of javax.lang.model.element.TypeParameterElement in project buck by facebook.

the class TreeBackedTreesTest method testGetTreeNullGetPathRoundtripTypeParameterElement.

@Test
public void testGetTreeNullGetPathRoundtripTypeParameterElement() throws IOException {
    compile("class Foo<T, U> { }");
    TypeParameterElement tElement = elements.getTypeElement("Foo").getTypeParameters().get(0);
    Tree tTree = trees.getTree(tElement);
    TreePath tPath = trees.getPath(tElement);
    // Odd behavior by javac, but we'll match it
    assertNull(tTree);
    assertSame(tElement, trees.getElement(tPath));
}
Also used : TreePath(com.sun.source.util.TreePath) Tree(com.sun.source.tree.Tree) TypeParameterElement(javax.lang.model.element.TypeParameterElement) Test(org.junit.Test)

Aggregations

TypeParameterElement (javax.lang.model.element.TypeParameterElement)40 TypeElement (javax.lang.model.element.TypeElement)20 TypeMirror (javax.lang.model.type.TypeMirror)17 Test (org.junit.Test)17 TypeVariable (javax.lang.model.type.TypeVariable)6 ArrayList (java.util.ArrayList)5 ExecutableElement (javax.lang.model.element.ExecutableElement)5 DeclaredType (javax.lang.model.type.DeclaredType)5 Element (javax.lang.model.element.Element)4 VariableElement (javax.lang.model.element.VariableElement)4 AbstractJClass (com.helger.jcodemodel.AbstractJClass)2 HashSet (java.util.HashSet)2 List (java.util.List)2 Map (java.util.Map)2 ArrayType (javax.lang.model.type.ArrayType)2 PrimitiveType (javax.lang.model.type.PrimitiveType)2 ITypeBinding (org.eclipse.jdt.core.dom.ITypeBinding)2 JsonMapper (com.bluelinelabs.logansquare.JsonMapper)1 LoganSquare (com.bluelinelabs.logansquare.LoganSquare)1 ParameterizedType (com.bluelinelabs.logansquare.ParameterizedType)1