eclint
Version:
Validate or fix code that doesn't adhere to EditorConfig settings or infer settings from existing code.
96 lines • 3 kB
JavaScript
var EditorConfigError = require("../editor-config-error");
var RE_LEADING_SPACES = /^ *$/;
function getNumber(num, fallback) {
num = +num;
if (isNaN(num)) {
return fallback && fallback();
}
return num;
}
function resolve(settings) {
var result = (settings.indent_size === 'tab')
? settings.tab_width
: settings.indent_size;
return getNumber(result, getNumber.bind(this, settings.tab_width));
}
function checkLine(line, indentSize) {
if (!line.prefix ||
!RE_LEADING_SPACES.test(line.prefix) ||
(line.blockCommentStart &&
line.prefix.length === (line.blockCommentStart.prefix.length + line.padSize))) {
return;
}
var softTabCount = line.prefix.length / indentSize;
if (indentSize % 2) {
softTabCount = Math.floor(softTabCount);
}
else {
softTabCount = Math.round(softTabCount);
}
var expectedIndentSize = softTabCount * indentSize;
if (line.prefix.length !== expectedIndentSize) {
var error = new EditorConfigError('invalid indent size: %s, expected: %s', line.prefix.length, expectedIndentSize);
error.lineNumber = line.number;
error.rule = 'indent_size';
error.source = line.text;
return error;
}
}
function check(settings, document) {
if (settings.indent_style === 'tab') {
return [];
}
var indentSize = resolve(settings);
if (indentSize) {
return document.lines.map(function (line) {
return checkLine(line, indentSize);
}).filter(Boolean);
}
return [];
}
function fix(_settings, document) {
return document; // noop
}
function infer(document) {
var scores = {};
var lastIndentSize = 0;
var lastLeadingSpacesLength = 0;
function vote(leadingSpacesLength) {
if (leadingSpacesLength) {
lastIndentSize = Math.abs(leadingSpacesLength - lastLeadingSpacesLength) || lastIndentSize;
if (lastIndentSize > 1) {
scores[lastIndentSize] = scores[lastIndentSize] || 0;
scores[lastIndentSize]++;
}
}
else {
lastIndentSize = 0;
}
lastLeadingSpacesLength = leadingSpacesLength;
}
document.lines.forEach(function (line) {
if (!line.isBlockComment && line.string && RE_LEADING_SPACES.test(line.prefix)) {
vote(line.prefix.length);
}
});
var bestScore = 0;
var result = 0;
for (var indentSize in scores) {
var score = scores[indentSize];
if (score > bestScore) {
bestScore = score;
result = +indentSize;
}
}
return result;
}
var IndentSizeRule = {
check: check,
fix: fix,
infer: infer,
resolve: resolve,
type: 'DocumentRule',
};
module.exports = IndentSizeRule;
//# sourceMappingURL=indent_size.js.map
;