From 0c8d8a3d0f07f477a29d0edb3e281d3c395bf094 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Thu, 11 Feb 2021 23:43:59 -0800 Subject: [PATCH] fix(docs): correctly detect type-only overrides (#5430) --- utils/doclint/api_parser.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/utils/doclint/api_parser.js b/utils/doclint/api_parser.js index 6015092258..ba375542c2 100644 --- a/utils/doclint/api_parser.js +++ b/utils/doclint/api_parser.js @@ -104,7 +104,7 @@ class ApiParser { } const clazz = this.classes.get(match[2]); const existingMember = clazz.membersArray.find(m => m.name === name && m.kind === member.kind); - if (existingMember && !existingMember.langs.only) { + if (existingMember && isTypeOverride(existingMember, member)) { for (const lang of member.langs.only) { existingMember.langs.types = existingMember.langs.types || {}; existingMember.langs.types[lang] = returnType; @@ -134,7 +134,7 @@ class ApiParser { const arg = this.parseProperty(spec); arg.name = name; const existingArg = method.argsArray.find(m => m.name === arg.name); - if (existingArg) { + if (existingArg && isTypeOverride(existingArg, arg)) { if (!arg.langs || !arg.langs.only) throw new Error('Override does not have lang: ' + spec.text); for (const lang of arg.langs.only) { @@ -338,4 +338,20 @@ function childrenWithoutProperties(spec) { return spec.children.filter(c => c.liType !== 'bullet' || !c.text.startsWith('langs')); } +/** + * @param {Documentation.Member} existingMember + * @param {Documentation.Member} member + * @returns {boolean} + */ +function isTypeOverride(existingMember, member) { + if (!existingMember.langs.only) + return true; + if (member.langs.only.every(l => existingMember.langs.only.includes(l))) { + return true; + } else if (member.langs.only.some(l => existingMember.langs.only.includes(l))) { + throw new Error(`Ambiguous language override for: ${member.name}`); + } + return false; +} + module.exports = { parseApi };