Встроенная поддержка блоков кода

ESLint рассматривает код как поток токенов, в котором комментарии выполняют не декоративную, а функциональную роль. Встроенная поддержка блоков кода реализуется через систему директив, процессоров и конфигурационных областей, позволяющих управлять анализом не только на уровне файла, но и внутри его фрагментов.

Блочные директивы управления анализом

Ключевой механизм встроенного управления — блочные комментарии, изменяющие поведение линтинга на ограниченном участке кода.

Отключение и включение правил

Базовый механизм основан на парных директивах:

/* eslint-disable */
const x = 1;
const y = 2;
/* eslint-enable */

Такой блок полностью исключает анализ указанных правил (или всех правил при отсутствии аргументов) внутри диапазона.

Расширенная форма позволяет управлять отдельными правилами:

/* eslint-disable no-console, no-unused-vars */
console.log("test");
let unused;

Активация обратно включается симметричной директивой:

/* eslint-enable no-console */

Локальные блоки и точечные отключения

Помимо классических блоков, ESLint поддерживает точечное управление:

/* eslint-disable-next-line no-console */
console.log("debug");

/* eslint-disable-line no-console */
console.log("debug");

Эти конструкции формируют виртуальные одноразовые блоки анализа, не требующие парного включения.

Встроенные конфигурационные блоки

ESLint допускает изменение конфигурации прямо внутри исходного файла через комментарии eslint.

Переопределение правил

/* eslint quotes: ["error", "single"] */
const str = "text";

Конфигурация действует с момента объявления и до конца файла либо до следующего изменения.

Локальные исключения и подавления

Конфигурационные блоки могут комбинироваться с отключением правил:

/* eslint no-alert: "off" */
alert("message");

или с более детальной настройкой:

/* eslint eqeqeq: ["error", "always"] */

Обработка блочных конструкций в различных форматах файлов

Встроенная поддержка кодовых блоков в ESLint выходит за пределы JavaScript-файлов и охватывает внешние форматы через систему процессоров.

Markdown и fenced code blocks

При анализе Markdown-файлов ESLint не интерпретирует код напрямую. Для этого используется процессор, извлекающий блоки вида:

```js
const a = 1

После обработки такие фрагменты превращаются в виртуальные JavaScript-файлы, которые проходят стандартный пайплайн линтинга.

Особенности обработки:

- кодовые блоки извлекаются по языковым тегам;
- сохраняется контекст строки для корректного отображения ошибок;
- результаты связываются с исходным Markdown-файлом.

#### JSON, HTML и смешанные форматы

Подобный принцип применяется к другим форматам при использовании соответствующих процессоров:

- HTML-файлы разбиваются на `<script>` и `<style>` блоки;
- JSON обрабатывается как единый AST без комментариев;
- Vue/Svelte-подобные структуры анализируются как набор вложенных блоков.

### Модель виртуальных файлов и блочная изоляция

Каждый выделенный блок кода рассматривается как независимая единица анализа. Это означает, что ESLint:

- создаёт отдельное абстрактное синтаксическое дерево (AST) для каждого блока;
- применяет конфигурацию, активную на момент обработки блока;
- сохраняет связь между исходным и виртуальным расположением кода.

Такой подход позволяет:

- изолировать ошибки внутри конкретных фрагментов;
- корректно обрабатывать многоконтекстные документы;
- поддерживать единообразие правил вне зависимости от источника кода.

### Наследование и приоритет директив внутри блоков

Внутри одного файла или документа может существовать несколько уровней конфигурации:

1. глобальная конфигурация проекта;
2. конфигурация файла;
3. inline-комментарии;
4. локальные директивы блоков.

При конфликте приоритет имеет наиболее локальный уровень. Например:

```js
/* eslint no-console: "error" */

console.log("global error");

/* eslint no-console: "off" */
console.log("no error here");

После повторного включения правило снова активируется.

Ограничения блочной системы

Несмотря на гибкость, система встроенных блоков имеет ряд ограничений:

  • невозможность изменения parserOptions внутри кода;
  • невозможность динамического изменения подключённых плагинов;
  • ограниченная область действия директив — только текущий файл или виртуальный блок;
  • различия в поведении при использовании разных процессоров.

Детекция и контроль отключённых блоков

ESLint предоставляет механизм контроля подавленных правил через reportUnusedDisableDirectives. Он позволяет выявлять:

  • лишние eslint-disable блоки;
  • устаревшие отключения правил;
  • избыточные точечные директивы.

Пример поведения:

/* eslint-disable no-unused-vars */
const x = 1;

Если правило больше не срабатывает, директива может быть помечена как неиспользуемая.

Взаимодействие блочных директив с анализом AST

При обработке кода ESLint связывает комментарии с узлами AST через позиции токенов. Это обеспечивает:

  • точное определение области действия директив;
  • корректную обработку вложенных конструкций;
  • синхронизацию сообщений об ошибках с исходным текстом.

Комментарий не рассматривается как текстовый элемент, а интегрируется в структуру синтаксического дерева.

Применение блочной модели в архитектуре ESLint

Блочная модель является частью более широкой архитектуры анализа:

  • парсер формирует AST;
  • процессоры разбивают входной текст на блоки;
  • движок линтинга применяет правила к каждому блоку;
  • результаты агрегируются в единый отчёт.

Такая структура обеспечивает единообразное поведение ESLint при работе с разнородными источниками кода, сохраняя при этом локальную точность анализа внутри каждого блока.