All files / transpiler/output/headers/generators generateEnumHeader.ts

100% Statements 13/13
100% Branches 6/6
100% Functions 3/3
100% Lines 13/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54                                                  26x     26x 2x     24x 24x     24x 44x     24x   64x 64x 64x     24x   24x        
/**
 * Enum Header Generator
 *
 * Generates C typedef enum declarations from symbol information.
 * Used by HeaderGenerator to emit full enum definitions in headers.
 */
 
import IHeaderTypeInput from "./IHeaderTypeInput";
 
/**
 * Generate a C typedef enum declaration for the given enum name.
 *
 * Output format:
 * ```c
 * typedef enum {
 *     EnumName_MEMBER1 = 0,
 *     EnumName_MEMBER2 = 1
 * } EnumName;
 * ```
 *
 * @param name - The enum type name
 * @param input - Symbol information containing enum members
 * @returns C typedef enum declaration, or comment if enum data unavailable
 */
function generateEnumHeader(name: string, input: IHeaderTypeInput): string {
  const members = input.enumMembers.get(name);
 
  // Graceful fallback if enum data not available
  if (!members || members.size === 0) {
    return `/* Enum: ${name} (see implementation for values) */`;
  }
 
  const lines: string[] = [];
  lines.push("typedef enum {");
 
  // Convert members to sorted array for consistent output
  const memberEntries = Array.from(members.entries()).sort(
    ([, a], [, b]) => a - b,
  );
 
  memberEntries.forEach(([memberName, value], index) => {
    // Prefix member names with enum name to avoid C namespace collisions
    const prefixedName = `${name}_${memberName}`;
    const comma = index < memberEntries.length - 1 ? "," : "";
    lines.push(`    ${prefixedName} = ${value}${comma}`);
  });
 
  lines.push(`} ${name};`);
 
  return lines.join("\n");
}
 
export default generateEnumHeader;