@coffeelint/cli
Version:
Lint your CoffeeScript
81 lines (70 loc) • 2.68 kB
JavaScript
(function() {
var NewlinesAfterClasses;
module.exports = NewlinesAfterClasses = (function() {
class NewlinesAfterClasses {
lintToken(token, tokenApi) {
var afters, comment, ending, got, lineNumber, lines, numIndents, outdent, ref, ref1, start, trueLine, type;
[
type,
numIndents,
{
first_line: lineNumber
}
] = token;
({lines} = tokenApi);
ending = tokenApi.config[this.rule.name].value;
if (type === 'CLASS') {
this.classCount++;
}
if (this.classCount > 0 && (token.generated != null)) {
if (type === '{' && ((ref = token.origin) != null ? ref[0] : void 0) === ':') {
this.classBracesCount++;
}
if (type === '}' && ((ref1 = token.origin) != null ? ref1[0] : void 0) === 'OUTDENT') {
this.classBracesCount--;
this.classCount--;
if (this.classCount === 0 && this.classBracesCount === 0) {
afters = 1;
comment = 0;
outdent = token.origin[2].first_line;
start = Math.min(lineNumber, outdent);
trueLine = start + 1;
while (/^\s*(#|$)/.test(lines[start + afters])) {
if (/^\s*#/.test(lines[start + afters])) {
comment += 1;
}
afters += 1;
}
// add up blank lines, subtract comments, subtract 2 because
// before/after counters started at 1.
got = afters - comment - 1;
// if `got` and `ending` don't match throw an error _unless_
// we are at the end of the file.
if (got !== ending && trueLine + got !== lines.length) {
return {
context: `Expected ${ending} got ${got}`,
lineNumber: trueLine
};
}
}
}
}
}
};
NewlinesAfterClasses.prototype.rule = {
type: 'style',
name: 'newlines_after_classes',
value: 3,
level: 'ignore',
message: 'Wrong count of blank lines between a class and other code',
description: `<p>Checks the number of blank lines between classes and other code.</p>
Options:
- <pre><code>value</code></pre> - The number of required blank lines
after class definitions. Defaults to 3.`
};
NewlinesAfterClasses.prototype.tokens = ['CLASS', '}', '{'];
NewlinesAfterClasses.prototype.classBracesCount = 0;
NewlinesAfterClasses.prototype.classCount = 0;
return NewlinesAfterClasses;
}).call(this);
}).call(this);