Class PreprocessorContexts

java.lang.Object
com.github._1c_syntax.bsl.languageserver.context.compilation.PreprocessorContexts

public final class PreprocessorContexts extends Object
Состояние вложенных веток препроцессора при последовательном обходе файла.

Директивы передаются в порядке исходного текста через enterIf(BSLParser.Preproc_ifContext), enterElsif(BSLParser.Preproc_elsifContext), enterElse() и enterEndif(). Ветки используют контексты, оставшиеся после предыдущих веток инструкции; вложенные инструкции ограничены активной веткой родителя. Перед повторным обходом нужен clear().

Пустое множество означает известную недостижимость, null — неизвестное условие, например пользовательский символ. Неизвестность распространяется на остаток инструкции и вложенные ветки. Диагностика в этом случае пропускает проверку, а фильтрация CFG сохраняет обе ветки. Экземпляр относится к одному обходу и не предназначен для совместного использования потоками. Статический evaluate(BSLParser.Preproc_expressionContext) не использует состояние обхода.

  • Constructor Details

    • PreprocessorContexts

      public PreprocessorContexts()
    • PreprocessorContexts

      public PreprocessorContexts(FileType fileType)
  • Method Details

    • clear

      public void clear()
      Сбросить стек перед новым обходом файла.

      После сброса active() возвращает все контексты.

    • enter

      public boolean enter(BSLParser.PreprocessorContext node)
      Обработать условную директиву в последовательном обходе файла.
      Parameters:
      node - инструкция препроцессора, включая незавершённую
      Returns:
      true для #Если/#ИначеЕсли/#Иначе/#КонецЕсли; остальные инструкции не меняют состояние и дают false
    • enterIf

      public void enterIf(BSLParser.Preproc_ifContext ctx)
      Открыть инструкцию #Если внутри текущей ветки.
      Parameters:
      ctx - директива с условием первой ветки.
    • enterElsif

      public void enterElsif(BSLParser.Preproc_elsifContext ctx)
      Перейти к #ИначеЕсли, исключив контексты пройденных веток этой инструкции. При отсутствии открытой инструкции состояние не меняется.
      Parameters:
      ctx - директива с условием следующей ветки.
    • enterElse

      public void enterElse()
      Перейти к #Иначе: активными становятся оставшиеся контексты. Неизвестное предыдущее условие сохраняет неизвестность. Без открытой инструкции вызов ничего не меняет.
    • enterEndif

      public void enterEndif()
      Закрыть ближайшую инструкцию #Если и восстановить ветку родителя. При пустом стеке вызов ничего не меняет.
    • active

      public @Nullable Set<ExecutionContext> active()
      Получить ограничения препроцессора в текущей точке обхода.

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

      Returns:
      активные контексты, все контексты вне инструкций или пустое множество для исключённой ветки; null, если условие окружающей ветки не удалось вычислить.
    • evaluate

      Вычислить условие как множество контекстов, в которых оно истинно.

      Поддерживаются символы контекстов 1С, скобки и операции НЕ, И, ИЛИ с обычным приоритетом. Символы ОС, неизвестные лексемы и неполное выражение дают null. Неизвестные части не упрощаются по правилам короткого замыкания.

      Parameters:
      expression - условие без окружающего стека директив; может быть null.
      Returns:
      самостоятельное изменяемое множество истинных контекстов, в том числе пустое; null для отсутствующего или невычислимого условия.
    • evaluate

      public static @Nullable Set<ExecutionContext> evaluate(@Nullable BSLParser.Preproc_expressionContext expression, FileType fileType)
      Вычислить условие по символам выбранного диалекта, сохраняя неизвестность пользовательских флагов.