diff --git a/tools/doc/json.js b/tools/doc/json.js index b2165c15d23c90..3d08026daaabd8 100644 --- a/tools/doc/json.js +++ b/tools/doc/json.js @@ -280,21 +280,30 @@ function parseSignature(text, sig) { var params = text.match(paramExpr); if (!params) return; params = params[1]; - // the [ is irrelevant. ] indicates optionalness. - params = params.replace(/\[/g, ''); params = params.split(/,/); + var optionalLevel = 0; + var optionalCharDict = {'[': 1, ' ': 0, ']': -1}; params.forEach(function(p, i, _) { p = p.trim(); if (!p) return; var param = sig.params[i]; var optional = false; var def; - // [foo] -> optional - if (p.charAt(p.length - 1) === ']') { - optional = true; - p = p.replace(/\]/g, ''); - p = p.trim(); + + // for grouped optional params such as someMethod(a[, b[, c]]) + var pos; + for (pos = 0; pos < p.length; pos++) { + if (optionalCharDict[p[pos]] === undefined) { break; } + optionalLevel += optionalCharDict[p[pos]]; + } + p = p.substring(pos); + optional = (optionalLevel > 0); + for (pos = p.length - 1; pos >= 0; pos--) { + if (optionalCharDict[p[pos]] === undefined) { break; } + optionalLevel += optionalCharDict[p[pos]]; } + p = p.substring(0, pos + 1); + var eq = p.indexOf('='); if (eq !== -1) { def = p.substr(eq + 1);