summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js')
-rw-r--r--tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js366
1 files changed, 11 insertions, 355 deletions
diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
index 2c80b344eb..7d6d06d7a7 100644
--- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
+++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
@@ -11,6 +11,8 @@ var _getDefaultTagStructureForMode = _interopRequireDefault(require("./getDefaul
var _tagNames = require("./tagNames");
+var _hasReturnValue = require("./utils/hasReturnValue");
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable jsdoc/no-undefined-types */
@@ -117,6 +119,8 @@ const getPropertiesFromPropertySignature = propSignature => {
const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
+ var _functionNode$value;
+
// eslint-disable-next-line complexity
const getParamName = (param, isProperty) => {
var _param$left, _param$left3;
@@ -254,7 +258,11 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
throw new Error(`Unsupported function signature format: \`${param.type}\`.`);
};
- return (functionNode.params || functionNode.value.params).map(param => {
+ if (!functionNode) {
+ return [];
+ }
+
+ return (functionNode.params || ((_functionNode$value = functionNode.value) === null || _functionNode$value === void 0 ? void 0 : _functionNode$value.params) || []).map(param => {
return getParamName(param);
});
};
@@ -629,358 +637,6 @@ const tagMissingRequiredTypeOrNamepath = (tag, tagMap = tagStructure) => {
const mustHaveEither = tagMustHaveEitherTypeOrNamePosition(tag.tag, tagMap);
const hasEither = tagMightHaveEitherTypeOrNamePosition(tag.tag, tagMap) && (hasTypePosition || hasNameOrNamepathPosition);
return mustHaveEither && !hasEither && !mustHaveTypePosition;
-};
-/**
- * Checks if a node is a promise but has no resolve value or an empty value.
- * An `undefined` resolve does not count.
- *
- * @param {object} node
- * @returns {boolean}
- */
-
-
-const isNewPromiseExpression = node => {
- return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' && node.callee.name === 'Promise';
-};
-
-const isVoidPromise = node => {
- var _node$typeParameters, _node$typeParameters$, _node$typeParameters$2;
-
- return (node === null || node === void 0 ? void 0 : (_node$typeParameters = node.typeParameters) === null || _node$typeParameters === void 0 ? void 0 : (_node$typeParameters$ = _node$typeParameters.params) === null || _node$typeParameters$ === void 0 ? void 0 : (_node$typeParameters$2 = _node$typeParameters$[0]) === null || _node$typeParameters$2 === void 0 ? void 0 : _node$typeParameters$2.type) === 'TSVoidKeyword';
-};
-/**
- * @callback PromiseFilter
- * @param {object} node
- * @returns {boolean}
- */
-
-/**
- * Checks if a node has a return statement. Void return does not count.
- *
- * @param {object} node
- * @param {PromiseFilter} promFilter
- * @returns {boolean|Node}
- */
-// eslint-disable-next-line complexity
-
-
-const hasReturnValue = (node, promFilter) => {
- var _node$returnType, _node$returnType$type;
-
- if (!node) {
- return false;
- }
-
- switch (node.type) {
- case 'TSFunctionType':
- case 'TSMethodSignature':
- return !['TSVoidKeyword', 'TSUndefinedKeyword'].includes(node === null || node === void 0 ? void 0 : (_node$returnType = node.returnType) === null || _node$returnType === void 0 ? void 0 : (_node$returnType$type = _node$returnType.typeAnnotation) === null || _node$returnType$type === void 0 ? void 0 : _node$returnType$type.type);
-
- case 'MethodDefinition':
- return hasReturnValue(node.value, promFilter);
-
- case 'FunctionExpression':
- case 'FunctionDeclaration':
- case 'ArrowFunctionExpression':
- {
- return node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || hasReturnValue(node.body, promFilter);
- }
-
- case 'BlockStatement':
- {
- return node.body.some(bodyNode => {
- return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, promFilter);
- });
- }
-
- case 'LabeledStatement':
- case 'WhileStatement':
- case 'DoWhileStatement':
- case 'ForStatement':
- case 'ForInStatement':
- case 'ForOfStatement':
- case 'WithStatement':
- {
- return hasReturnValue(node.body, promFilter);
- }
-
- case 'IfStatement':
- {
- return hasReturnValue(node.consequent, promFilter) || hasReturnValue(node.alternate, promFilter);
- }
-
- case 'TryStatement':
- {
- return hasReturnValue(node.block, promFilter) || hasReturnValue(node.handler && node.handler.body, promFilter) || hasReturnValue(node.finalizer, promFilter);
- }
-
- case 'SwitchStatement':
- {
- return node.cases.some(someCase => {
- return someCase.consequent.some(nde => {
- return hasReturnValue(nde, promFilter);
- });
- });
- }
-
- case 'ReturnStatement':
- {
- // void return does not count.
- if (node.argument === null) {
- return false;
- }
-
- if (promFilter && isNewPromiseExpression(node.argument)) {
- // Let caller decide how to filter, but this is, at the least,
- // a return of sorts and truthy
- return promFilter(node.argument);
- }
-
- return true;
- }
-
- default:
- {
- return false;
- }
- }
-};
-/**
- * Avoids further checking child nodes if a nested function shadows the
- * resolver, but otherwise, if name is used (by call or passed in as an
- * argument to another function), will be considered as non-empty.
- *
- * This could check for redeclaration of the resolver, but as such is
- * unlikely, we avoid the performance cost of checking everywhere for
- * (re)declarations or assignments.
- *
- * @param {AST} node
- * @param {string} resolverName
- * @returns {boolean}
- */
-// eslint-disable-next-line complexity
-
-
-const hasNonEmptyResolverCall = (node, resolverName) => {
- if (!node) {
- return false;
- } // Arrow function without block
-
-
- switch (node.type) {
- // istanbul ignore next -- In Babel?
- case 'OptionalCallExpression':
- case 'CallExpression':
- return node.callee.name === resolverName && ( // Implicit or explicit undefined
- node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
- // Being passed in to another function (which might invoke it)
- return nde.type === 'Identifier' && nde.name === resolverName || // Handle nested items
- hasNonEmptyResolverCall(nde, resolverName);
- });
-
- case 'ChainExpression':
- case 'Decorator':
- case 'ExpressionStatement':
- return hasNonEmptyResolverCall(node.expression, resolverName);
-
- case 'ClassBody':
- case 'BlockStatement':
- return node.body.some(bodyNode => {
- return hasNonEmptyResolverCall(bodyNode, resolverName);
- });
-
- case 'FunctionExpression':
- case 'FunctionDeclaration':
- case 'ArrowFunctionExpression':
- {
- var _node$params$;
-
- // Shadowing
- if (((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
- return false;
- }
-
- return hasNonEmptyResolverCall(node.body, resolverName);
- }
-
- case 'LabeledStatement':
- case 'WhileStatement':
- case 'DoWhileStatement':
- case 'ForStatement':
- case 'ForInStatement':
- case 'ForOfStatement':
- case 'WithStatement':
- {
- return hasNonEmptyResolverCall(node.body, resolverName);
- }
-
- case 'ConditionalExpression':
- case 'IfStatement':
- {
- return hasNonEmptyResolverCall(node.test, resolverName) || hasNonEmptyResolverCall(node.consequent, resolverName) || hasNonEmptyResolverCall(node.alternate, resolverName);
- }
-
- case 'TryStatement':
- {
- return hasNonEmptyResolverCall(node.block, resolverName) || hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) || hasNonEmptyResolverCall(node.finalizer, resolverName);
- }
-
- case 'SwitchStatement':
- {
- return node.cases.some(someCase => {
- return someCase.consequent.some(nde => {
- return hasNonEmptyResolverCall(nde, resolverName);
- });
- });
- }
-
- case 'ArrayPattern':
- case 'ArrayExpression':
- return node.elements.some(element => {
- return hasNonEmptyResolverCall(element, resolverName);
- });
-
- case 'AssignmentPattern':
- return hasNonEmptyResolverCall(node.right, resolverName);
-
- case 'AssignmentExpression':
- case 'BinaryExpression':
- case 'LogicalExpression':
- {
- return hasNonEmptyResolverCall(node.left, resolverName) || hasNonEmptyResolverCall(node.right, resolverName);
- }
- // Comma
-
- case 'SequenceExpression':
- case 'TemplateLiteral':
- return node.expressions.some(subExpression => {
- return hasNonEmptyResolverCall(subExpression, resolverName);
- });
-
- case 'ObjectPattern':
- case 'ObjectExpression':
- return node.properties.some(property => {
- return hasNonEmptyResolverCall(property, resolverName);
- });
- // istanbul ignore next -- In Babel?
-
- case 'ClassMethod':
- case 'MethodDefinition':
- return node.decorators && node.decorators.some(decorator => {
- return hasNonEmptyResolverCall(decorator, resolverName);
- }) || node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
- // istanbul ignore next -- In Babel?
-
- case 'ObjectProperty':
- /* eslint-disable no-fallthrough */
- // istanbul ignore next -- In Babel?
-
- case 'PropertyDefinition': // istanbul ignore next -- In Babel?
-
- case 'ClassProperty':
- /* eslint-enable no-fallthrough */
-
- case 'Property':
- return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
- // istanbul ignore next -- In Babel?
-
- case 'ObjectMethod':
- // istanbul ignore next -- In Babel?
- return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || node.arguments.some(nde => {
- return hasNonEmptyResolverCall(nde, resolverName);
- });
-
- case 'ClassExpression':
- case 'ClassDeclaration':
- return hasNonEmptyResolverCall(node.body, resolverName);
-
- case 'AwaitExpression':
- case 'SpreadElement':
- case 'UnaryExpression':
- case 'YieldExpression':
- return hasNonEmptyResolverCall(node.argument, resolverName);
-
- case 'VariableDeclaration':
- {
- return node.declarations.some(nde => {
- return hasNonEmptyResolverCall(nde, resolverName);
- });
- }
-
- case 'VariableDeclarator':
- {
- return hasNonEmptyResolverCall(node.id, resolverName) || hasNonEmptyResolverCall(node.init, resolverName);
- }
-
- case 'TaggedTemplateExpression':
- return hasNonEmptyResolverCall(node.quasi, resolverName);
- // ?.
- // istanbul ignore next -- In Babel?
-
- case 'OptionalMemberExpression':
- case 'MemberExpression':
- return hasNonEmptyResolverCall(node.object, resolverName) || hasNonEmptyResolverCall(node.property, resolverName);
- // istanbul ignore next -- In Babel?
-
- case 'Import':
- case 'ImportExpression':
- return hasNonEmptyResolverCall(node.source, resolverName);
-
- case 'ReturnStatement':
- {
- if (node.argument === null) {
- return false;
- }
-
- return hasNonEmptyResolverCall(node.argument, resolverName);
- }
-
- /*
- // Shouldn't need to parse literals/literal components, etc.
- case 'Identifier':
- case 'TemplateElement':
- case 'Super':
- // Exports not relevant in this context
- */
-
- default:
- return false;
- }
-};
-/**
- * Checks if a Promise executor has no resolve value or an empty value.
- * An `undefined` resolve does not count.
- *
- * @param {object} node
- * @param {boolean} anyPromiseAsReturn
- * @returns {boolean}
- */
-
-
-const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn) => {
- return hasReturnValue(node, prom => {
- if (anyPromiseAsReturn) {
- return true;
- }
-
- if (isVoidPromise(prom)) {
- return false;
- }
-
- const [{
- params,
- body
- } = {}] = prom.arguments;
-
- if (!(params !== null && params !== void 0 && params.length)) {
- return false;
- }
-
- const [{
- name: resolverName
- }] = params;
- return hasNonEmptyResolverCall(body, resolverName);
- });
}; // eslint-disable-next-line complexity
@@ -1497,10 +1153,10 @@ var _default = {
hasATag,
hasDefinedTypeTag,
hasParams,
- hasReturnValue,
+ hasReturnValue: _hasReturnValue.hasReturnValue,
hasTag,
hasThrowValue,
- hasValueOrExecutorHasNonEmptyResolveValue,
+ hasValueOrExecutorHasNonEmptyResolveValue: _hasReturnValue.hasValueOrExecutorHasNonEmptyResolveValue,
hasYieldValue,
isConstructor,
isGetter,