context.report является центральным механизмом внутри
пользовательских правил ESLint, отвечающим за фиксацию найденных
нарушений. Любое правило, анализирующее AST-код, в конечном итоге
использует именно этот метод для передачи информации о проблеме в ядро
линтера.
Объект context, передаваемый в функцию правила,
инкапсулирует среду выполнения правила: текущий файл, настройки, утилиты
для работы с кодом и, ключевое, метод report. Через него
правило сообщает ESLint:
Фактически context.report связывает анализ и
результирующую диагностику.
Современный ESLint поддерживает два основных формата вызова:
context.report({
node,
message: "Unexpected console statement"
});
context.report(node, "Unexpected console statement");
Позиционный формат сохраняется для обратной совместимости, но в современных правилах используется объектный вариант как расширяемый и более безопасный.
nodeУказывает на узел AST, к которому относится ошибка. ESLint использует этот узел для вычисления позиции (строка, столбец) и для подсветки фрагмента кода.
context.report({
node: node,
message: "Запрещённый вызов"
});
Ключевое поведение:
node.loc;node.range;loc.messageОсновной текст ошибки.
context.report({
node,
message: "Использование eval запрещено"
});
Ограничения:
dataПозволяет параметризовать сообщение через шаблоны.
context.report({
node,
message: "Неожиданный тип: {{type}}",
data: {
type: node.type
}
});
Механизм подстановки:
{{key}} заменяется значением из data;locИспользуется, когда нет AST-узла, но необходимо указать позицию вручную.
context.report({
loc: {
start: { line: 1, column: 0 },
end: { line: 1, column: 10 }
},
message: "Ошибка в диапазоне без узла"
});
Применяется в случаях:
fixОдной из ключевых возможностей context.report является
автоматическое исправление кода.
context.report({
node,
message: "Удалите console.log",
fix(fixer) {
return fixer.remove(node);
}
});
Механизм работы:
fix получает объект fixer;--fix.Основные методы fixer:
remove(node) — удаление узла;insertTextBefore(node, text) — вставка перед;insertTextAfter(node, text) — вставка после;replaceText(node, text) — полная замена;replaceTextRange(range, text) — замена по
диапазону.Пример замены:
context.report({
node,
message: "Замените var на let",
fix(fixer) {
return fixer.replaceText(node, "let");
}
});
fix может возвращать массив:
context.report({
node,
message: "Упрощение конструкции",
fix(fixer) {
return [
fixer.remove(node.left),
fixer.replaceText(node.right, "value")
];
}
});
Ограничения:
suggestПомимо автоматического исправления, ESLint поддерживает альтернативные предложения:
context.report({
node,
message: "Возможное улучшение",
suggest: [
{
desc: "Заменить на const",
fix(fixer) {
return fixer.replaceText(node.kind, "const");
}
}
]
});
Свойства:
desc — описание предложения;fix — функция исправления.Особенности:
reportМетод вызывается только при соблюдении логики правила:
if (node.name === "eval") {
context.report({
node,
message: "Запрещён вызов eval"
});
}
Рекомендации архитектуры правил:
report в обход AST-логики.Одно правило может генерировать множество ошибок:
for (const n of nodes) {
context.report({
node: n,
message: "Недопустимый идентификатор"
});
}
Поведение ESLint:
Использование context.report влияет на:
Рекомендации:
report.context.report тесно связан с объектом
SourceCode, доступным через:
const sourceCode = context.getSourceCode();
Использование:
Пример:
const token = sourceCode.getFirstToken(node);
context.report({
node,
loc: token.loc,
message: "Проблемный токен"
});
ESLint поддерживает два уровня точности:
node) — стандартный вариант;loc) — более точный.Пример токеновой диагностики:
const token = sourceCode.getTokenAfter(node);
context.report({
loc: token.loc,
message: "Лишний токен"
});
Используется при:
Каждый вызов context.report формирует объект
результата:
{
ruleId: "no-console",
message: "Unexpected console statement",
line: 3,
column: 5,
nodeType: "MemberExpression"
}
Дополнительные поля:
fixable — наличие fix;suggestions — список альтернатив;severity — уровень ошибки.context.reportТипичные проблемы:
Отсутствие node или loc → ESLint не
может определить позицию.
Динамически изменяемые сообщения без data →
ухудшение читаемости и консистентности.
Пересекающиеся фиксы → автоматическое отключение исправления.
Частые вызовы в глубокой рекурсии → деградация производительности.
--fix.report используется для inline диагностики;suggest отображается как quick fix;context.report не изменяет интерфейс, но влияет на:
Любое кастомное правило ESLint строится вокруг связки:
context.report.Минимальная структура:
export default {
create(context) {
return {
Identifier(node) {
if (node.name === "debug") {
context.report({
node,
message: "Запрещён debug"
});
}
}
};
}
};
Эта модель делает context.report фундаментальным
элементом всей системы ESLint-правил.