visitMethodElement method

  1. @override
void visitMethodElement(
  1. MethodElement element
)
override

Implementation

@override
void visitMethodElement(MethodElement element) {
  super.visitMethodElement(element);

  if (!methodChecker.hasAnnotationOf(element)) {
    return;
  }

  final annotation = methodChecker.annotationsOf(element);

  if (annotation.length > 1) {
    throw Exception('Only one method type per method is allowed');
  }

  final method = MethodAnnotation.fromAnnotation(annotation.first);

  // only one method type per method
  if (methods[method.name] case final parsed?) {
    for (final parsedMethod in parsed) {
      if (parsedMethod.path == method.path) {
        throw Exception('Conflicting paths ${parsedMethod.path}');
      }
    }
  }

  final params = getParams(element).toList();

  (methods[method.name] ??= []).add(
    MetaMethod(
      name: element.name ?? (throw Exception('Method name is null')),
      method: method.name,
      path: method.path,
      params: params,
      isSse: method.isSse,
      returnType: MetaType.fromType(element.returnType),
      webSocketMethod: method.isWebSocket
          ? MetaWebSocketMethod.fromMeta(method.asWebSocket)
          : null,
      annotationsFor:
          ({required List<OnMatch> onMatch, NonMatch? onNonMatch}) =>
              getAnnotations(
                element: element,
                onNonMatch: onNonMatch,
                onMatch: onMatch,
              ),
    ),
  );
}