Class PreprocessorContexts
Директивы передаются в порядке исходного текста через enterIf(BSLParser.Preproc_ifContext), enterElsif(BSLParser.Preproc_elsifContext),
enterElse() и enterEndif(). Ветки используют контексты, оставшиеся после
предыдущих веток инструкции; вложенные инструкции ограничены активной веткой родителя.
Перед повторным обходом нужен clear().
Пустое множество означает известную недостижимость, null — неизвестное условие,
например пользовательский символ. Неизвестность распространяется на остаток инструкции и вложенные ветки.
Диагностика в этом случае пропускает проверку, а фильтрация CFG сохраняет обе ветки.
Экземпляр относится к одному обходу и не предназначен для совместного использования потоками.
Статический evaluate(BSLParser.Preproc_expressionContext) не использует состояние обхода.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionactive()Получить ограничения препроцессора в текущей точке обхода.voidclear()Сбросить стек перед новым обходом файла.booleanОбработать условную директиву в последовательном обходе файла.voidПерейти к#Иначе: активными становятся оставшиеся контексты.voidПерейти к#ИначеЕсли, исключив контексты пройденных веток этой инструкции.voidЗакрыть ближайшую инструкцию#Еслии восстановить ветку родителя.voidОткрыть инструкцию#Есливнутри текущей ветки.static @Nullable Set<ExecutionContext> evaluate(@Nullable BSLParser.Preproc_expressionContext expression) Вычислить условие как множество контекстов, в которых оно истинно.static @Nullable Set<ExecutionContext> evaluate(@Nullable BSLParser.Preproc_expressionContext expression, FileType fileType) Вычислить условие по символам выбранного диалекта, сохраняя неизвестность пользовательских флагов.
-
Constructor Details
-
PreprocessorContexts
public PreprocessorContexts() -
PreprocessorContexts
-
-
Method Details
-
clear
public void clear()Сбросить стек перед новым обходом файла.После сброса
active()возвращает все контексты. -
enter
Обработать условную директиву в последовательном обходе файла.- Parameters:
node- инструкция препроцессора, включая незавершённую- Returns:
trueдля #Если/#ИначеЕсли/#Иначе/#КонецЕсли; остальные инструкции не меняют состояние и даютfalse
-
enterIf
Открыть инструкцию#Есливнутри текущей ветки.- Parameters:
ctx- директива с условием первой ветки.
-
enterElsif
Перейти к#ИначеЕсли, исключив контексты пройденных веток этой инструкции. При отсутствии открытой инструкции состояние не меняется.- Parameters:
ctx- директива с условием следующей ветки.
-
enterElse
public void enterElse()Перейти к#Иначе: активными становятся оставшиеся контексты. Неизвестное предыдущее условие сохраняет неизвестность. Без открытой инструкции вызов ничего не меняет. -
enterEndif
public void enterEndif()Закрыть ближайшую инструкцию#Еслии восстановить ветку родителя. При пустом стеке вызов ничего не меняет. -
active
Получить ограничения препроцессора в текущей точке обхода.Результат не пересекается с контекстами модуля, директивой метода или настройками диагностики. Возвращаемое множество представляет состояние обхода; вызывающему не следует его изменять.
- Returns:
- активные контексты, все контексты вне инструкций или пустое множество для исключённой
ветки;
null, если условие окружающей ветки не удалось вычислить.
-
evaluate
public static @Nullable Set<ExecutionContext> evaluate(@Nullable BSLParser.Preproc_expressionContext expression) Вычислить условие как множество контекстов, в которых оно истинно.Поддерживаются символы контекстов 1С, скобки и операции
НЕ,И,ИЛИс обычным приоритетом. Символы ОС, неизвестные лексемы и неполное выражение даютnull. Неизвестные части не упрощаются по правилам короткого замыкания.- Parameters:
expression- условие без окружающего стека директив; может бытьnull.- Returns:
- самостоятельное изменяемое множество истинных контекстов, в том числе пустое;
nullдля отсутствующего или невычислимого условия.
-
evaluate
public static @Nullable Set<ExecutionContext> evaluate(@Nullable BSLParser.Preproc_expressionContext expression, FileType fileType) Вычислить условие по символам выбранного диалекта, сохраняя неизвестность пользовательских флагов.
-