From a1c9824be2bbbf1766e04145a4e4c7a52bd9935d Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Sat, 13 Jul 2019 00:25:17 -0700 Subject: [PATCH] fix(no-undefined-types): ensure working in all contexts; fixes #324 --- src/iterateJsdoc.js | 8 ++++++-- src/jsdocUtils.js | 13 +++++++++++++ src/rules/noUndefinedTypes.js | 1 + test/rules/assertions/noUndefinedTypes.js | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/iterateJsdoc.js b/src/iterateJsdoc.js index c533427a2..aa88f5a7b 100644 --- a/src/iterateJsdoc.js +++ b/src/iterateJsdoc.js @@ -206,7 +206,11 @@ const getUtils = ( }; utils.getClassNode = () => { - const greatGrandParent = ancestors.slice(-3)[0]; + // Ancestors missing in `Program` comment iteration + const greatGrandParent = ancestors.length ? + ancestors.slice(-3)[0] : + jsdocUtils.getAncestor(sourceCode, jsdocNode, 3); + const greatGrandParentValue = greatGrandParent && sourceCode.getFirstToken(greatGrandParent).value; if (greatGrandParentValue === 'class') { @@ -350,7 +354,7 @@ const iterateAllJsdocs = (iterator, ruleConfig) => { return { create (context) { return { - 'Program:exit' () { + 'Program' () { const sourceCode = context.getSourceCode(); const comments = sourceCode.getAllComments(); diff --git a/src/jsdocUtils.js b/src/jsdocUtils.js index 43e195fc4..fbb65d524 100644 --- a/src/jsdocUtils.js +++ b/src/jsdocUtils.js @@ -545,9 +545,22 @@ const getTagsByType = (tags, tagPreference) => { }; }; +const getAncestor = (sourceCode, nde, depth, idx = 0) => { + if (idx === depth) { + return nde; + } + const prevToken = sourceCode.getTokenBefore(nde); + if (prevToken) { + return getAncestor(sourceCode, prevToken, depth, idx + 1); + } + + return null; +}; + export default { enforcedContexts, filterTags, + getAncestor, getContextObject, getFunctionParameterNames, getJsdocParameterNames, diff --git a/src/rules/noUndefinedTypes.js b/src/rules/noUndefinedTypes.js index cec6ea600..860026915 100644 --- a/src/rules/noUndefinedTypes.js +++ b/src/rules/noUndefinedTypes.js @@ -132,6 +132,7 @@ export default iterateJsdoc(({ }); }); }, { + iterateAllJsdocs: true, meta: { schema: [ { diff --git a/test/rules/assertions/noUndefinedTypes.js b/test/rules/assertions/noUndefinedTypes.js index 14d304540..5afe23872 100644 --- a/test/rules/assertions/noUndefinedTypes.js +++ b/test/rules/assertions/noUndefinedTypes.js @@ -208,6 +208,25 @@ export default { message: 'The type \'TEMPLATE_TYPE\' is undefined.' } ] + }, + { + code: ` + /** + * @type {strnig} + */ + var quux = { + + }; + `, + errors: [ + { + line: 3, + message: 'The type \'strnig\' is undefined.' + } + ], + rules: { + 'no-undef': 'error' + } } ], valid: [