MCPcopy Index your code
hub / github.com/github/copilot-sdk / generatePolymorphicClasses

Function generatePolymorphicClasses

scripts/codegen/csharp.ts:812–857  ·  view source on GitHub ↗

* Generate a polymorphic base class and derived classes for a discriminated union.

(
    baseClassName: string,
    discriminatorProperty: string,
    variants: JSONSchema7[],
    knownTypes: Map<string, string>,
    nestedClasses: Map<string, string>,
    enumOutput: string[],
    description?: string,
    propertyResolver?: PropertyTypeResolver,
    experimental = false,
    options: DiscriminatedUnionGenerationOptions = {}
)

Source from the content-addressed store, hash-verified

810 * Generate a polymorphic base class and derived classes for a discriminated union.
811 */
812function generatePolymorphicClasses(
813 baseClassName: string,
814 discriminatorProperty: string,
815 variants: JSONSchema7[],
816 knownTypes: Map<string, string>,
817 nestedClasses: Map<string, string>,
818 enumOutput: string[],
819 description?: string,
820 propertyResolver?: PropertyTypeResolver,
821 experimental = false,
822 options: DiscriminatedUnionGenerationOptions = {}
823): string {
824 const resolver = propertyResolver ?? resolveSessionPropertyType;
825 const lines: string[] = [];
826 const discriminatorInfo = findDiscriminator(variants)!;
827 const renamedBase = applyTypeRename(baseClassName);
828
829 lines.push(...xmlDocCommentWithFallback(description, `Polymorphic base type discriminated by <c>${escapeXml(discriminatorProperty)}</c>.`, ""));
830 if (experimental) pushExperimentalAttribute(lines);
831 lines.push(`[JsonPolymorphic(`);
832 lines.push(` TypeDiscriminatorPropertyName = "${discriminatorProperty}",`);
833 lines.push(` UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]`);
834
835 for (const { value } of discriminatorInfo.mapping.values()) {
836 const constValue = String(value);
837 const derivedClassName = applyTypeRename(`${baseClassName}${toPascalCase(constValue)}`);
838 lines.push(`[JsonDerivedType(typeof(${derivedClassName}), "${escapeCSharpStringLiteral(constValue)}")]`);
839 }
840
841 lines.push(`public partial class ${renamedBase}`);
842 lines.push(`{`);
843 lines.push(` /// <summary>The type discriminator.</summary>`);
844 lines.push(` [JsonPropertyName("${discriminatorProperty}")]`);
845 lines.push(` public virtual string ${toPascalCase(discriminatorProperty)} { get; set; } = string.Empty;`);
846 lines.push(`}`);
847 lines.push("");
848
849 for (const { value, schema } of discriminatorInfo.mapping.values()) {
850 const constValue = String(value);
851 const derivedClassName = applyTypeRename(`${baseClassName}${toPascalCase(constValue)}`);
852 const derivedCode = generateDerivedClass(derivedClassName, renamedBase, discriminatorProperty, constValue, schema, knownTypes, nestedClasses, enumOutput, resolver, experimental, options);
853 nestedClasses.set(derivedClassName, derivedCode);
854 }
855
856 return lines.join("\n");
857}
858
859/**
860 * Generate a derived class for a discriminated union variant.

Callers 1

Calls 12

applyTypeRenameFunction · 0.85
escapeXmlFunction · 0.85
StringFunction · 0.85
generateDerivedClassFunction · 0.85
joinMethod · 0.80
findDiscriminatorFunction · 0.70
toPascalCaseFunction · 0.70
pushMethod · 0.45
setMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…