From 544ca37c0030f7cab0072b99aaa51142c45862a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Kondratiuk?= Date: Thu, 20 May 2021 20:24:05 -0300 Subject: [PATCH] chore(dotnet): generate clone constructors for options (#6684) --- utils/doclint/generateDotnetApi.js | 68 +++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/utils/doclint/generateDotnetApi.js b/utils/doclint/generateDotnetApi.js index bb6c9ad0e5..270ef474cd 100644 --- a/utils/doclint/generateDotnetApi.js +++ b/utils/doclint/generateDotnetApi.js @@ -237,8 +237,11 @@ function renderEnum(name, literals) { */ function renderOptionType(name, type) { const body = []; + + renderConstructors(name, type, body); + for (const member of type.properties) - renderMember(member, type, {}, body); + renderMember(member, member.type, {}, body); writeFile('public class', name, null, body, optionsDir); } @@ -292,6 +295,28 @@ function toTitleCase(name) { return name.charAt(0).toUpperCase() + name.substring(1); } +/** + * + * @param {string} name + * @param {Documentation.Type} type + * @param {string[]} out + */ +function renderConstructors(name, type, out) { + out.push(`public ${name}(){}`); + out.push(''); + out.push(`public ${name}(${name} clone) {`); + out.push(`if(clone == null) return;`); + + type.properties.forEach(p => { + let propType = translateType(p.type, type, t => generateNameDefault(p, name, t, type)); + let propName = toMemberName(p); + const overloads = getPropertyOverloads(propType, p, propName, p.type); + for (let { name } of overloads) + out.push(`${name} = clone.${name};`); + }); + out.push(`}`); +} + /** * * @param {Documentation.Member} member @@ -323,19 +348,7 @@ function renderMember(member, parent, options, out) { console.warn(`children property found in ${parent.name}, assuming array.`); type = `IEnumerable<${parent.name}>`; } - const overloads = []; - if (type) { - let jsonName = member.name; - if (member.type.expression === '[string]|[float]') - jsonName = `${member.name}String`; - overloads.push({ type, name, jsonName }); - } else { - for (const overload of member.type.union) { - const t = translateType(overload, parent, t => generateNameDefault(member, name, t, parent)); - const suffix = toOverloadSuffix(t); - overloads.push({ type: t, name: name + suffix, jsonName: member.name + suffix }); - } - } + const overloads = getPropertyOverloads(type, member, name, parent); for (let { type, name, jsonName } of overloads) { out.push(''); if (member.spec) @@ -343,7 +356,7 @@ function renderMember(member, parent, options, out) { if (!member.clazz) out.push(`[JsonPropertyName("${jsonName}")]`) if (!type.endsWith('?') && !member.required && nullableTypes.includes(type)) - type = `${type}?`; + type = `${type}?`; if (member.clazz) out.push(`public ${type} ${name} { get; }`); else @@ -354,6 +367,31 @@ function renderMember(member, parent, options, out) { throw new Error(`Problem rendering a member: ${type} - ${name} (${member.kind})`); } +/** + * + * @param {string} type + * @param {Documentation.Member} member + * @param {string} name + * @param {Documentation.Class|Documentation.Type} parent + * @returns [{ type: string; name: string; jsonName: string; }] + */ +function getPropertyOverloads(type, member, name, parent) { + const overloads = []; + if (type) { + let jsonName = member.name; + if (member.type.expression === '[string]|[float]') + jsonName = `${member.name}String`; + overloads.push({ type, name, jsonName }); + } else { + for (const overload of member.type.union) { + const t = translateType(overload, parent, t => generateNameDefault(member, name, t, parent)); + const suffix = toOverloadSuffix(t); + overloads.push({ type: t, name: name + suffix, jsonName: member.name + suffix }); + } + } + return overloads; +} + /** * * @param {Documentation.Member} member