Class PreprocessorReachability

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

public final class PreprocessorReachability extends Object
Проверка достижимости текущей ветки препроцессора при последовательном обходе файла.

Для BSL учитываются допустимые сочетания символов платформы из PreprocessorContexts. В OneScript одна из ОС Windows/Linux/MacOS выбрана обязательно; Mono и пользовательские символы независимы от ОС. Ограничение ОС сохраняется и в формулах с неизвестными пользовательскими флагами. В обоих диалектах дополнительно проверяются логические противоречия, включая символы ОС. Конкретная ОС и пользовательские определения не предполагаются.

Поиск ограничен числом вычислений узлов формулы. Исчерпание лимита и ошибки разбора сохраняют потенциальную достижимость. Экземпляр принадлежит одному обходу файла.

  • Constructor Summary

    Constructors
    Constructor
    Description
    Создать состояние для одного файла.
  • Method Summary

    Modifier and Type
    Method
    Description
    Получить ограничения текущей ветки по режимам платформы.
    boolean
    Обработать условную директиву при последовательном обходе файла.
    void
    Перейти в остаток инструкции; повторный или непарный #Иначе не доказывает недостижимость.
    void
    Перейти к альтернативе с учётом всех предыдущих условий этой инструкции.
    void
    Закрыть инструкцию и восстановить состояние родительской ветки.
    void
    Открыть вложенную инструкцию, ограниченную текущей веткой.
    boolean
    Проверить, исключена ли текущая ветка при любом допустимом наборе символов.
    boolean
    isUnreachable(Set<ExecutionContext> possibleContexts)
    Проверить ветку с учётом возможностей охватывающего модуля и директивы метода.
    boolean
    Проверить структуру после обхода всего файла.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • PreprocessorReachability

      public PreprocessorReachability(FileType fileType)
      Создать состояние для одного файла.
      Parameters:
      fileType - диалект, определяющий известные символы и допустимые контексты.
  • Method Details

    • enter

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

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

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

      public void enterElse()
      Перейти в остаток инструкции; повторный или непарный #Иначе не доказывает недостижимость.
    • enterEndif

      public void enterEndif()
      Закрыть инструкцию и восстановить состояние родительской ветки.
    • isUnreachable

      public boolean isUnreachable()
      Проверить, исключена ли текущая ветка при любом допустимом наборе символов.
      Returns:
      true только при доказанной недостижимости; неизвестность даёт false.
    • isUnreachable

      public boolean isUnreachable(Set<ExecutionContext> possibleContexts)
      Проверить ветку с учётом возможностей охватывающего модуля и директивы метода.
      Parameters:
      possibleContexts - возможные режимы окружающего кода; неизвестные ограничения не должны сужать это множество.
      Returns:
      true, если ветка исключена во всех возможных режимах.
    • activeContexts

      public @Nullable Set<ExecutionContext> activeContexts()
      Получить ограничения текущей ветки по режимам платформы.
      Returns:
      множество режимов соответствующего диалекта, включая пустое для исключённой ветки; null для неизвестного условия или повреждённой структуры. Множество нельзя изменять.
    • isWellFormed

      public boolean isWellFormed()
      Проверить структуру после обхода всего файла.
      Returns:
      все инструкции закрыты, альтернативы упорядочены и условия не содержат ошибок парсера.