tools/apiview/parsers/rust-api-parser/src/process-items/processTrait.ts (79 lines of code) (raw):
import { ReviewLine, TokenKind } from "../models/apiview-models";
import { Crate, Item } from "../../rustdoc-types/output/rustdoc-types";
import { processItem } from "./processItem";
import { createDocsReviewLines } from "./utils/generateDocReviewLine";
import { isTraitItem } from "./utils/typeGuards";
import { createGenericBoundTokens, processGenerics } from "./utils/processGenerics";
import { getAPIJson } from "../main";
import { lineIdMap } from "../utils/lineIdUtils";
/**
* Processes a trait item and adds its documentation to the ReviewLine.
*
* @param {Crate} apiJson - The API JSON object containing all items.
* @param {Item} item - The trait item to process.
* @param {ReviewLine} reviewLine - The ReviewLine object to update.
*/
export function processTrait(item: Item): ReviewLine[] {
if (!isTraitItem(item)) return [];
const apiJson = getAPIJson();
const reviewLines: ReviewLine[] = item.docs ? createDocsReviewLines(item) : [];
lineIdMap.set(item.id.toString(), `trait_${item.name}`);
// Create the ReviewLine object
const reviewLine: ReviewLine = {
LineId: item.id.toString(),
Tokens: [],
Children: [],
};
reviewLine.Tokens.push({
Kind: TokenKind.Keyword,
Value: "pub",
});
if (item.inner.trait.is_unsafe) {
reviewLine.Tokens.push({
Kind: TokenKind.Keyword,
Value: "unsafe",
});
}
reviewLine.Tokens.push({
Kind: TokenKind.Keyword,
Value: "trait",
});
reviewLine.Tokens.push({
Kind: TokenKind.MemberName,
Value: item.name || "unknown_trait",
RenderClasses: ["struct"],
NavigateToId: item.id.toString(),
NavigationDisplayName: item.name || undefined,
HasSuffixSpace: false,
});
const genericsTokens = processGenerics(item.inner.trait.generics);
// Add generics params if present
if (item.inner.trait.generics) {
reviewLine.Tokens.push(...genericsTokens.params);
}
if (item.inner.trait.bounds) {
const boundTokens = createGenericBoundTokens(item.inner.trait.bounds);
if (boundTokens.length > 0) {
reviewLine.Tokens.push({ Kind: TokenKind.Text, Value: ":", HasPrefixSpace: false });
reviewLine.Tokens.push(...boundTokens);
}
}
// Add generics where clauses if present
if (item.inner.trait.generics) {
reviewLine.Tokens.push(...genericsTokens.wherePredicates);
}
reviewLine.Tokens.push({
Kind: TokenKind.Punctuation,
Value: "{",
HasPrefixSpace: true,
});
if (item.inner.trait.items) {
item.inner.trait.items.forEach((associatedItem: number) => {
if (!reviewLine.Children) reviewLine.Children = [];
const childReviewLines = processItem(apiJson.index[associatedItem]);
if (childReviewLines) reviewLine.Children.push(...childReviewLines);
});
}
reviewLines.push(reviewLine);
reviewLines.push({
RelatedToLine: item.id.toString(),
Tokens: [
{
Kind: TokenKind.Punctuation,
Value: "}",
},
],
IsContextEndLine: true,
});
return reviewLines;
}