All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.sundr.adapter.apt.ExecutableElementToMethod Maven / Gradle / Ivy

package io.sundr.adapter.apt;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.AnnotationValueVisitor;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;

import io.sundr.model.AnnotationRef;
import io.sundr.model.AttributeKey;
import io.sundr.model.Attributeable;
import io.sundr.model.ClassRef;
import io.sundr.model.Method;
import io.sundr.model.MethodBuilder;
import io.sundr.model.Modifiers;
import io.sundr.model.Property;
import io.sundr.model.TypeRef;
import io.sundr.utils.Strings;

public class ExecutableElementToMethod implements Function {

  private static final String NEWLINE_PATTERN = "\r|\n";

  private final AptContext context;
  private final Function referenceAdapterFunction;
  private final Function propertyAdapterFunction;
  private final Function annotationAdapterFunction;

  public ExecutableElementToMethod(AptContext context, Function referenceAdapterFunction,
      Function propertyAdapterFunction,
      Function annotationAdapterFunction) {
    this.context = context;
    this.referenceAdapterFunction = referenceAdapterFunction;
    this.propertyAdapterFunction = propertyAdapterFunction;
    this.annotationAdapterFunction = annotationAdapterFunction;
  }

  public Method apply(ExecutableElement executableElement) {
    Map attributes = new HashMap<>();
    if (executableElement.getDefaultValue() != null && executableElement.getDefaultValue().getValue() != null) {
      Object defaultValue = executableElement.getDefaultValue().accept(new AnnotationValueVisitor() {
        public Object visit(AnnotationValue av) {
          return String.valueOf(av);
        }

        @Override
        public Object visit(AnnotationValue av, Object p) {
          return String.valueOf(av);
        }

        @Override
        public Object visitBoolean(boolean b, Object p) {
          return String.valueOf(b);
        }

        @Override
        public Object visitByte(byte b, Object p) {
          return String.valueOf(b);
        }

        @Override
        public Object visitChar(char c, Object p) {
          return String.valueOf(c);
        }

        @Override
        public Object visitDouble(double d, Object p) {
          return String.valueOf(d);
        }

        @Override
        public Object visitFloat(float f, Object p) {
          return String.valueOf(f);
        }

        @Override
        public Object visitInt(int i, Object p) {
          return String.valueOf(i);
        }

        @Override
        public Object visitLong(long i, Object p) {
          return String.valueOf(i) + "L";
        }

        @Override
        public Object visitShort(short s, Object p) {
          return String.valueOf(s);
        }

        @Override
        public Object visitString(String s, Object p) {
          return s;
        }

        @Override
        public Object visitType(TypeMirror t, Object p) {
          return t.toString();
        }

        @Override
        public Object visitEnumConstant(VariableElement c, Object p) {
          if (c.getSimpleName().toString().contains(c.getEnclosingElement().toString())) {
            return c.getSimpleName().toString();
          }
          return c.getEnclosingElement() + "." + c.getSimpleName();
        }

        @Override
        public Object visitAnnotation(AnnotationMirror a, Object p) {
          return a;
        }

        @Override
        public Object visitArray(List vals, Object p) {
          return vals;
        }

        @Override
        public Object visitUnknown(AnnotationValue av, Object p) {
          return av;
        }
      }, null);

      attributes.put(Attributeable.DEFAULT_VALUE, String.valueOf(defaultValue));
    }
    String comments = context.getElements().getDocComment(executableElement);
    List commentList = Strings.isNullOrEmpty(comments) ? new ArrayList<>()
        : Arrays.stream(comments.split(NEWLINE_PATTERN)).map(String::trim).filter(s -> !s.isEmpty())
            .collect(Collectors.toList());
    MethodBuilder methodBuilder = new MethodBuilder().withComments(commentList)
        .withDefaultMethod(executableElement.isDefault())
        .withModifiers(Modifiers.from(executableElement.getModifiers()))
        .withName(executableElement.getSimpleName().toString())
        .withReturnType(referenceAdapterFunction.apply(executableElement.getReturnType()))
        .withVarArgPreferred(executableElement.isVarArgs()).withAttributes(attributes);

    // Populate constructor parameters
    for (VariableElement variableElement : executableElement.getParameters()) {
      methodBuilder = methodBuilder.addToArguments(propertyAdapterFunction.apply(variableElement));
    }
    List exceptionRefs = new ArrayList();
    for (TypeMirror thrownType : executableElement.getThrownTypes()) {
      TypeRef thrownRef = referenceAdapterFunction.apply(thrownType);
      if (thrownRef instanceof ClassRef) {
        exceptionRefs.add((ClassRef) thrownRef);
      }
      methodBuilder = methodBuilder.withExceptions(exceptionRefs);
    }

    for (AnnotationMirror annotationMirror : executableElement.getAnnotationMirrors()) {
      methodBuilder = methodBuilder.withAnnotations(annotationAdapterFunction.apply(annotationMirror));
    }
    return methodBuilder.build();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy