Func? parseFunctionDeclaration()

in lib/src/header_parser/sub_parsers/functiondecl_parser.dart [26:90]


Func? parseFunctionDeclaration(clang_types.CXCursor cursor) {
  _stack.push(_ParserFunc());

  final funcUsr = cursor.usr();
  final funcName = cursor.spelling();
  if (shouldIncludeFunc(funcUsr, funcName)) {
    _logger.fine('++++ Adding Function: ${cursor.completeStringRepr()}');

    final rt = _getFunctionReturnType(cursor);
    final parameters = _getParameters(cursor, funcName);

    if (clang.clang_Cursor_isFunctionInlined(cursor) != 0) {
      _logger.fine(
          '---- Removed Function, reason: inline function: ${cursor.completeStringRepr()}');
      _logger.warning(
          "Skipped Function '$funcName', inline functions are not supported.");
      return _stack
          .pop()
          .func; // Returning null so that [addToBindings] function excludes this.
    }

    if (rt.isIncompleteCompound || _stack.top.incompleteStructParameter) {
      _logger.fine(
          '---- Removed Function, reason: Incomplete struct pass/return by value: ${cursor.completeStringRepr()}');
      _logger.warning(
          "Skipped Function '$funcName', Incomplete struct pass/return by value not supported.");
      return _stack
          .pop()
          .func; // Returning null so that [addToBindings] function excludes this.
    }

    if (rt.getBaseType().broadType == BroadType.Unimplemented ||
        _stack.top.unimplementedParameterType) {
      _logger.fine(
          '---- Removed Function, reason: unsupported return type or parameter type: ${cursor.completeStringRepr()}');
      _logger.warning(
          "Skipped Function '$funcName', function has unsupported return type or parameter type.");
      return _stack
          .pop()
          .func; // Returning null so that [addToBindings] function excludes this.
    }

    _stack.top.func = Func(
      dartDoc: getCursorDocComment(
        cursor,
        nesting.length + commentPrefix.length,
      ),
      usr: funcUsr,
      name: config.functionDecl.renameUsingConfig(funcName),
      originalName: funcName,
      returnType: rt,
      parameters: parameters,
      exposeSymbolAddress:
          config.functionDecl.shouldIncludeSymbolAddress(funcName),
      exposeFunctionTypedefs:
          config.exposeFunctionTypedefs.shouldInclude(funcName),
      isLeaf: config.leafFunctions.shouldInclude(funcName),
    );
    bindingsIndex.addFuncToSeen(funcUsr, _stack.top.func!);
  } else if (bindingsIndex.isSeenFunc(funcUsr)) {
    _stack.top.func = bindingsIndex.getSeenFunc(funcUsr);
  }

  return _stack.pop().func;
}