Search in sources :

Example 1 with SourceField

use of com.github.davityle.ngprocessor.source.SourceField in project ngAndroid by davityle.

the class ModelSourceLinker method getSourceLink.

private NgModelSourceLink getSourceLink(Element element) {
    TypeMirror fieldType = element.asType();
    TypeElement typeElement = typeUtils.asTypeElement(fieldType);
    Option<String> packageName = elementUtils.getPackageName(typeElement);
    String fullName = elementUtils.getFullName(typeElement);
    List<SourceField> fields = new ArrayList<>();
    String modelName = elementUtils.stripClassName(fieldType);
    List<? extends Element> enclosedElements = typeElement.getEnclosedElements();
    boolean isInterface = typeElement.getKind().isInterface();
    if (isInterface) {
        messageUtils.error(Option.of(typeElement), "Model must be a class");
    }
    Set<String> duplicateCheck = new HashSet<>();
    for (int index = 0; index < enclosedElements.size(); index++) {
        Element enclosedElement = enclosedElements.get(index);
        if (elementUtils.isSetter(enclosedElement)) {
            ExecutableElement setter = (ExecutableElement) enclosedElement;
            if (!elementUtils.returnsVoid(setter)) {
                messageUtils.error(Option.of(element), "Setter '%s' must not return a value", element.toString());
                continue;
            }
            Set<Modifier> modifiers = setter.getModifiers();
            if (modifiers.contains(Modifier.PRIVATE) || modifiers.contains(Modifier.PROTECTED)) {
                messageUtils.error(Option.of(setter), "Unable to access field '%s' from scope '%s'. Must have default or public access", element.toString(), element.getEnclosingElement().toString());
                continue;
            }
            String fName = setter.getSimpleName().toString().substring(3).toLowerCase();
            if (duplicateCheck.contains(fName)) {
                messageUtils.error(Option.of(setter), "Field '%s' in model '%s' is a duplicate.", setter.getSimpleName().toString().substring(3), fullName);
                continue;
            }
            duplicateCheck.add(fName);
            TypeMirror typeMirror = setter.getParameters().get(0).asType();
            String type = typeMirror.toString();
            SourceField sourceField = new SourceField(fName, type, primitiveUtils);
            sourceField.setSetter(setter.getSimpleName().toString());
            // TODO O(n^2) is the best
            boolean getterFound = false;
            for (Element possGetter : enclosedElements) {
                if (elementUtils.isGetterForField(possGetter, fName, typeMirror.getKind())) {
                    sourceField.setGetter(possGetter.getSimpleName().toString());
                    getterFound = true;
                    break;
                }
            }
            if (!getterFound) {
                messageUtils.error(Option.of(setter), "Field '%s' is missing a corresponding getter", fName);
            }
            fields.add(sourceField);
        }
    }
    return new NgModelSourceLink(modelName, packageName, fullName, isInterface, fields, element);
}
Also used : TypeElement(javax.lang.model.element.TypeElement) SourceField(com.github.davityle.ngprocessor.source.SourceField) ExecutableElement(javax.lang.model.element.ExecutableElement) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) ExecutableElement(javax.lang.model.element.ExecutableElement) ArrayList(java.util.ArrayList) NgModelSourceLink(com.github.davityle.ngprocessor.source.links.NgModelSourceLink) TypeMirror(javax.lang.model.type.TypeMirror) Modifier(javax.lang.model.element.Modifier) HashSet(java.util.HashSet)

Aggregations

SourceField (com.github.davityle.ngprocessor.source.SourceField)1 NgModelSourceLink (com.github.davityle.ngprocessor.source.links.NgModelSourceLink)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 Element (javax.lang.model.element.Element)1 ExecutableElement (javax.lang.model.element.ExecutableElement)1 Modifier (javax.lang.model.element.Modifier)1 TypeElement (javax.lang.model.element.TypeElement)1 TypeMirror (javax.lang.model.type.TypeMirror)1