UNPKG

eclint

Version:

Validate or fix code that doesn't adhere to EditorConfig settings or infer settings from existing code.

96 lines 3 kB
"use strict"; 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