Skip to content

Commit

Permalink
fix(valid-types): Parse multiple names in template tags for non-j…
Browse files Browse the repository at this point in the history
…sdoc modes; fixes #622
  • Loading branch information
brettz9 committed Aug 13, 2020
1 parent 905f689 commit 7818dde
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 2 deletions.
50 changes: 50 additions & 0 deletions README.md
Expand Up @@ -14126,6 +14126,32 @@ function quux() {
}
// Settings: {"jsdoc":{"structuredTags":{"see":{"required":["typeOrNameRequired"],"type":false}}}}
// Message: Cannot add "typeOrNameRequired" to `require` with the tag's `type` set to `false`

/**
* @template T<~, R
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
// Settings: {"jsdoc":{"mode":"closure"}}
// Message: Syntax error in namepath: T<~

/**
* @template T, R<~
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
// Settings: {"jsdoc":{"mode":"closure"}}
// Message: Syntax error in namepath: R<~
````

The following patterns are not considered problems:
Expand Down Expand Up @@ -14369,6 +14395,30 @@ function quux() {

}
// Settings: {"jsdoc":{"structuredTags":{"see":{"name":"namepath-referencing"}}}}

/**
* @template T, R
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
// Settings: {"jsdoc":{"mode":"closure"}}

/**
* @template T, R<~
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
// Settings: {"jsdoc":{"mode":"jsdoc"}}
````


4 changes: 4 additions & 0 deletions src/iterateJsdoc.js
Expand Up @@ -103,6 +103,10 @@ const getBasicUtils = (context, {tagNamePreference, mode}) => {
});
};

utils.parseClosureTemplateTag = (tag) => {
return jsdocUtils.parseClosureTemplateTag(tag);
};

utils.getPreferredTagNameObject = ({tagName}) => {
const ret = jsdocUtils.getPreferredTagName(context, mode, tagName, tagNamePreference);
const isObject = ret && typeof ret === 'object';
Expand Down
2 changes: 1 addition & 1 deletion src/rules/noUndefinedTypes.js
Expand Up @@ -112,7 +112,7 @@ export default iterateJsdoc(({
}

const closureGenericTypes = _.flatMap(templateTags, (tag) => {
return jsdocUtils.parseClosureTemplateTag(tag);
return utils.parseClosureTemplateTag(tag);
});

const allDefinedTypes = new Set(globalScope.variables.map(({name}) => {
Expand Down
8 changes: 7 additions & 1 deletion src/rules/validTypes.js
Expand Up @@ -164,7 +164,13 @@ export default iterateJsdoc(({
) && Boolean(tag.name);

if (hasNameOrNamepathPosition) {
validNamepathParsing(tag.name, tag.tag);
if (mode !== 'jsdoc' && tag.tag === 'template') {
utils.parseClosureTemplateTag(tag).forEach((namepath) => {
validNamepathParsing(namepath);
});
} else {
validNamepathParsing(tag.name, tag.tag);
}
}
});
}, {
Expand Down
88 changes: 88 additions & 0 deletions test/rules/assertions/validTypes.js
Expand Up @@ -632,6 +632,56 @@ export default {
},
},
},
{
code: `
/**
* @template T<~, R
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
`,
errors: [
{
line: 3,
message: 'Syntax error in namepath: T<~',
},
],
settings: {
jsdoc: {
mode: 'closure',
},
},
},
{
code: `
/**
* @template T, R<~
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
`,
errors: [
{
line: 3,
message: 'Syntax error in namepath: R<~',
},
],
settings: {
jsdoc: {
mode: 'closure',
},
},
},
],
valid: [
{
Expand Down Expand Up @@ -1051,5 +1101,43 @@ export default {
},
},
},
{
code: `
/**
* @template T, R
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
`,
settings: {
jsdoc: {
mode: 'closure',
},
},
},
{
code: `
/**
* @template T, R<~
* @param {function(!T): !R} parser
* @return {function(!Array<!T>): !Array<!R>}
*/
parseArray = function(parser) {
return function(array) {
return array.map(parser);
};
};
`,
settings: {
jsdoc: {
mode: 'jsdoc',
},
},
},
],
};

0 comments on commit 7818dde

Please sign in to comment.