tools/apiview/parsers/rust-api-parser/src/process-items/processEnum.ts (87 lines of code) (raw):

import { ReviewLine, TokenKind } from "../models/apiview-models"; import { Crate, Item } from "../../rustdoc-types/output/rustdoc-types"; import { ImplProcessResult, processImpl } from "./processImpl"; import { createDocsReviewLines } from "./utils/generateDocReviewLine"; import { processGenerics } from "./utils/processGenerics"; import { isEnumItem } from "./utils/typeGuards"; import { getAPIJson } from "../main"; import { lineIdMap } from "../utils/lineIdUtils"; export function processEnum(item: Item): ReviewLine[] { if (!isEnumItem(item)) return []; const apiJson = getAPIJson(); const reviewLines: ReviewLine[] = item.docs ? createDocsReviewLines(item) : []; lineIdMap.set(item.id.toString(), `enum_${item.name}`); // Process derives and impls let implResult: ImplProcessResult; if (item.inner.enum.impls) { implResult = processImpl({ ...item, inner: { enum: item.inner.enum } }); } const enumLine: ReviewLine = { LineId: item.id.toString(), Tokens: [], Children: [], }; if (implResult.deriveTokens.length > 0) { const deriveTokensLine: ReviewLine = { Tokens: implResult.deriveTokens, RelatedToLine: item.id.toString(), }; reviewLines.push(deriveTokensLine); } enumLine.Tokens.push({ Kind: TokenKind.Keyword, Value: "pub enum", }); enumLine.Tokens.push({ Kind: TokenKind.MemberName, Value: item.name || "unknown_enum", NavigateToId: item.id.toString(), NavigationDisplayName: item.name || undefined, RenderClasses: ["enum"], HasSuffixSpace: false, }); const genericsTokens = processGenerics(item.inner.enum.generics); // Add generics params if present if (item.inner.enum.generics) { enumLine.Tokens.push(...genericsTokens.params); } // Add generics where clauses if present if (item.inner.enum.generics) { enumLine.Tokens.push(...genericsTokens.wherePredicates); } enumLine.Tokens.push({ Kind: TokenKind.Punctuation, Value: "{", HasPrefixSpace: true, }); // Process enum variants if (item.inner.enum.variants) { enumLine.Children = item.inner.enum.variants.map((variant: number) => { const variantItem = apiJson.index[variant]; lineIdMap.set(variantItem.id.toString(), `variant_${variantItem.name}`); return { LineId: variantItem.id.toString(), Tokens: [ { Kind: TokenKind.Text, Value: variantItem.name || "unknown_variant", HasSuffixSpace: false, }, { Kind: TokenKind.Punctuation, Value: ",", HasSuffixSpace: false, }, ], }; }); } reviewLines.push(enumLine); reviewLines.push({ RelatedToLine: item.id.toString(), Tokens: [{ Kind: TokenKind.Punctuation, Value: "}" }], }); if (implResult.implBlock) { reviewLines.push(...implResult.implBlock); } if (implResult.traitImpls.length > 0) { reviewLines.push(...implResult.traitImpls); } return reviewLines; }