chore(dotnet): generate clone constructors for options (#6684)
This commit is contained in:
parent
2cdf1e122c
commit
544ca37c00
|
|
@ -237,8 +237,11 @@ function renderEnum(name, literals) {
|
||||||
*/
|
*/
|
||||||
function renderOptionType(name, type) {
|
function renderOptionType(name, type) {
|
||||||
const body = [];
|
const body = [];
|
||||||
|
|
||||||
|
renderConstructors(name, type, body);
|
||||||
|
|
||||||
for (const member of type.properties)
|
for (const member of type.properties)
|
||||||
renderMember(member, type, {}, body);
|
renderMember(member, member.type, {}, body);
|
||||||
writeFile('public class', name, null, body, optionsDir);
|
writeFile('public class', name, null, body, optionsDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -292,6 +295,28 @@ function toTitleCase(name) {
|
||||||
return name.charAt(0).toUpperCase() + name.substring(1);
|
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
|
* @param {Documentation.Member} member
|
||||||
|
|
@ -323,19 +348,7 @@ function renderMember(member, parent, options, out) {
|
||||||
console.warn(`children property found in ${parent.name}, assuming array.`);
|
console.warn(`children property found in ${parent.name}, assuming array.`);
|
||||||
type = `IEnumerable<${parent.name}>`;
|
type = `IEnumerable<${parent.name}>`;
|
||||||
}
|
}
|
||||||
const overloads = [];
|
const overloads = getPropertyOverloads(type, member, name, parent);
|
||||||
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 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (let { type, name, jsonName } of overloads) {
|
for (let { type, name, jsonName } of overloads) {
|
||||||
out.push('');
|
out.push('');
|
||||||
if (member.spec)
|
if (member.spec)
|
||||||
|
|
@ -343,7 +356,7 @@ function renderMember(member, parent, options, out) {
|
||||||
if (!member.clazz)
|
if (!member.clazz)
|
||||||
out.push(`[JsonPropertyName("${jsonName}")]`)
|
out.push(`[JsonPropertyName("${jsonName}")]`)
|
||||||
if (!type.endsWith('?') && !member.required && nullableTypes.includes(type))
|
if (!type.endsWith('?') && !member.required && nullableTypes.includes(type))
|
||||||
type = `${type}?`;
|
type = `${type}?`;
|
||||||
if (member.clazz)
|
if (member.clazz)
|
||||||
out.push(`public ${type} ${name} { get; }`);
|
out.push(`public ${type} ${name} { get; }`);
|
||||||
else
|
else
|
||||||
|
|
@ -354,6 +367,31 @@ function renderMember(member, parent, options, out) {
|
||||||
throw new Error(`Problem rendering a member: ${type} - ${name} (${member.kind})`);
|
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
|
* @param {Documentation.Member} member
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue