export function processFunction()

in tools/apiview/parsers/rust-api-parser/src/process-items/processFunction.ts [61:181]


export function processFunction(item: Item): ReviewLine[] {
  if (!isFunctionItem(item)) return [];
  const reviewLines: ReviewLine[] = item.docs ? createDocsReviewLines(item) : [];

  // Create the ReviewLine object
  const reviewLine: ReviewLine = {
    LineId: item.id.toString(),
    Tokens: [],
    Children: [],
  };

  reviewLine.Tokens.push({
    Kind: TokenKind.Keyword,
    Value: "pub",
  });

  // Process function header modifiers and ABI
  processFunctionHeader(item.inner.function.header, reviewLine);

  reviewLine.Tokens.push({
    Kind: TokenKind.Keyword,
    Value: "fn",
  });

  reviewLine.Tokens.push({
    Kind: TokenKind.MemberName,
    Value: item.name || "unknown_fn",
    HasSuffixSpace: false,
    RenderClasses: ["method"],
    NavigateToId: item.id.toString(),
    NavigationDisplayName: item.name || undefined,
  });

  const genericsTokens = processGenerics(item.inner.function.generics);
  // Add generics params if present
  if (item.inner.function.generics) {
    reviewLine.Tokens.push(...genericsTokens.params);
  }

  // Process function parameters
  reviewLine.Tokens.push({
    Kind: TokenKind.Punctuation,
    Value: "(",
    HasSuffixSpace: false,
    HasPrefixSpace: false,
  });

  // Add function parameters
  if (item.inner.function.sig.inputs.length > 0) {
    item.inner.function.sig.inputs.forEach((input: [string, Type], index: number) => {
      if (index > 0) {
        reviewLine.Tokens.push({
          Kind: TokenKind.Punctuation,
          Value: ", ",
          HasSuffixSpace: false,
        });
      }

      if (input[0] === "self") {
        reviewLine.Tokens.push({
          Kind: TokenKind.StringLiteral,
          Value: `&${input[0]}`,
          HasSuffixSpace: false,
        });
      } else {
        reviewLine.Tokens.push({
          Kind: TokenKind.StringLiteral,
          Value: input[0],
          HasSuffixSpace: false,
        });

        reviewLine.Tokens.push({
          Kind: TokenKind.Punctuation,
          Value: ": ",
          HasSuffixSpace: false,
        });
        reviewLine.Tokens.push(...typeToReviewTokens(input[1]));
      }
    });
  }

  reviewLine.Tokens.push({
    Kind: TokenKind.Punctuation,
    Value: ")",
    HasPrefixSpace: false,
    HasSuffixSpace: false,
  });

  // Add return type if present
  if (item.inner.function.sig.output) {
    reviewLine.Tokens.push({
      Kind: TokenKind.Punctuation,
      Value: "->",
      HasPrefixSpace: true,
    });
    reviewLine.Tokens.push(...typeToReviewTokens(item.inner.function.sig.output));
  }

  // Add generics where clauses if present
  if (item.inner.function.generics) {
    reviewLine.Tokens.push(...genericsTokens.wherePredicates);
  }

  if (item.inner.function.has_body) {
    reviewLine.Tokens.push({
      Kind: TokenKind.Punctuation,
      Value: "{}",
      HasSuffixSpace: false,
      HasPrefixSpace: true,
    });
  } else {
    reviewLine.Tokens.push({
      Kind: TokenKind.Punctuation,
      Value: ";",
      HasSuffixSpace: false,
    });
  }
  reviewLines.push(reviewLine);
  lineIdMap.set(item.id.toString(), `function_${item.name}`);
  return reviewLines;
}