From 6b4fc745a66756a2a2c26b27f7e0b2ab73c249bb Mon Sep 17 00:00:00 2001 From: Alexej Yaroshevich Date: Mon, 4 May 2015 01:12:36 +0300 Subject: [PATCH] disallowNewlineAfterDescription: mirror for require Ref #85 Closes gh-99 --- .../disallow-newline-after-description.js | 32 ++++++++ lib/rules/validate-jsdoc/index.js | 1 + .../disallow-newline-after-description.js | 76 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 lib/rules/validate-jsdoc/disallow-newline-after-description.js create mode 100644 test/lib/rules/validate-jsdoc/disallow-newline-after-description.js diff --git a/lib/rules/validate-jsdoc/disallow-newline-after-description.js b/lib/rules/validate-jsdoc/disallow-newline-after-description.js new file mode 100644 index 0000000..a2b58f1 --- /dev/null +++ b/lib/rules/validate-jsdoc/disallow-newline-after-description.js @@ -0,0 +1,32 @@ +module.exports = disallowNewlineAfterDescription; +module.exports.scopes = ['function']; +module.exports.options = { + disallowNewlineAfterDescription: {allowedValues: [true]} +}; + +var RE_NEWLINE_AT_THE_END = /\n$/; +var RE_NEWLINES = /\n/g; + +/** + * Disallows newline after description in jsdoc comment + * + * @param {(FunctionDeclaration|FunctionExpression)} node + * @param {Function} err + */ +function disallowNewlineAfterDescription(node, err) { + var doc = node.jsdoc; + if (!doc || !doc.tags.length || !doc.description || !doc.description.length) { + return; + } + + if (!RE_NEWLINE_AT_THE_END.test(doc.description)) { + return; + } + + var loc = node.jsdoc.loc.start; + var lines = doc.description.split(RE_NEWLINES); + err('Newline required after description', { + line: loc.line + lines.length, + column: loc.column + 3 + lines[lines.length - 1].length + }); +} diff --git a/lib/rules/validate-jsdoc/index.js b/lib/rules/validate-jsdoc/index.js index e13fbea..4df6eae 100644 --- a/lib/rules/validate-jsdoc/index.js +++ b/lib/rules/validate-jsdoc/index.js @@ -15,6 +15,7 @@ var validatorsByName = module.exports = { checkAnnotations: require('./check-annotations'), requireNewlineAfterDescription: require('./require-newline-after-description'), + disallowNewlineAfterDescription: require('./disallow-newline-after-description'), checkRedundantAccess: require('./check-redundant-access'), enforceExistence: require('./enforce-existence'), diff --git a/test/lib/rules/validate-jsdoc/disallow-newline-after-description.js b/test/lib/rules/validate-jsdoc/disallow-newline-after-description.js new file mode 100644 index 0000000..02273f8 --- /dev/null +++ b/test/lib/rules/validate-jsdoc/disallow-newline-after-description.js @@ -0,0 +1,76 @@ +describe('lib/rules/validate-jsdoc/disallow-newline-after-description', function () { + var checker = global.checker({ + additionalRules: ['lib/rules/validate-jsdoc.js'] + }); + + describe('not configured', function() { + + it('should report with undefined', function() { + global.expect(function() { + checker.configure({disallowNewlineAfterDescription: undefined}); + }).to.throws(/accepted value/i); + }); + + it('should report with an object', function() { + global.expect(function() { + checker.configure({disallowNewlineAfterDescription: {}}); + }).to.throws(/accepted value/i); + }); + + }); + + describe('with true', function() { + checker.rules({disallowNewlineAfterDescription: true}); + + checker.cases([ + /* jshint ignore:start */ + { + it: 'should not report common cases', + code: function() { + function fun(p) { + } + + /** + * Description + */ + function fun(p) { + } + + /** + * @param p + */ + function fun(p) { + } + } + }, { + it: 'should node report newline absence after description', + code: function () { + /** + * Some description + * @param {number} p description without hyphen + */ + function fun(p) { + } + }, + }, { + it: 'should report newline after description', + code: function () { + /** + * Some description. + * Get me higher and higher! + * + * @param {number} p description without hyphen + */ + function fun(p) {} + }, + errors: { + line: 4, + column: 3 + }, + } + /* jshint ignore:end */ + ]); + + }); + +});