Class PreprocessorReachability
java.lang.Object
com.github._1c_syntax.bsl.languageserver.context.compilation.PreprocessorReachability
Проверка достижимости текущей ветки препроцессора при последовательном обходе файла.
Для BSL учитываются допустимые сочетания символов платформы из PreprocessorContexts.
В OneScript одна из ОС Windows/Linux/MacOS выбрана обязательно; Mono и пользовательские символы
независимы от ОС. Ограничение ОС сохраняется и в формулах с неизвестными пользовательскими флагами.
В обоих диалектах дополнительно проверяются логические противоречия, включая символы ОС.
Конкретная ОС и пользовательские определения не предполагаются.
Поиск ограничен числом вычислений узлов формулы. Исчерпание лимита и ошибки разбора сохраняют потенциальную достижимость. Экземпляр принадлежит одному обходу файла.
-
Constructor Summary
ConstructorsConstructorDescriptionPreprocessorReachability(FileType fileType) Создать состояние для одного файла. -
Method Summary
Modifier and TypeMethodDescriptionПолучить ограничения текущей ветки по режимам платформы.booleanОбработать условную директиву при последовательном обходе файла.voidПерейти в остаток инструкции; повторный или непарный#Иначене доказывает недостижимость.voidПерейти к альтернативе с учётом всех предыдущих условий этой инструкции.voidЗакрыть инструкцию и восстановить состояние родительской ветки.voidОткрыть вложенную инструкцию, ограниченную текущей веткой.booleanПроверить, исключена ли текущая ветка при любом допустимом наборе символов.booleanisUnreachable(Set<ExecutionContext> possibleContexts) Проверить ветку с учётом возможностей охватывающего модуля и директивы метода.booleanПроверить структуру после обхода всего файла.
-
Constructor Details
-
PreprocessorReachability
Создать состояние для одного файла.- Parameters:
fileType- диалект, определяющий известные символы и допустимые контексты.
-
-
Method Details
-
enter
Обработать условную директиву при последовательном обходе файла.- Parameters:
node- инструкция препроцессора- Returns:
trueдля условной инструкции; области и прочие директивы не меняют состояние
-
enterIf
Открыть вложенную инструкцию, ограниченную текущей веткой.- Parameters:
node- директива с условием первой ветки.
-
enterElsif
Перейти к альтернативе с учётом всех предыдущих условий этой инструкции.- Parameters:
node- директива с условием следующей ветки.
-
enterElse
public void enterElse()Перейти в остаток инструкции; повторный или непарный#Иначене доказывает недостижимость. -
enterEndif
public void enterEndif()Закрыть инструкцию и восстановить состояние родительской ветки. -
isUnreachable
public boolean isUnreachable()Проверить, исключена ли текущая ветка при любом допустимом наборе символов.- Returns:
trueтолько при доказанной недостижимости; неизвестность даётfalse.
-
isUnreachable
Проверить ветку с учётом возможностей охватывающего модуля и директивы метода.- Parameters:
possibleContexts- возможные режимы окружающего кода; неизвестные ограничения не должны сужать это множество.- Returns:
true, если ветка исключена во всех возможных режимах.
-
activeContexts
Получить ограничения текущей ветки по режимам платформы.- Returns:
- множество режимов соответствующего диалекта, включая пустое для исключённой ветки;
nullдля неизвестного условия или повреждённой структуры. Множество нельзя изменять.
-
isWellFormed
public boolean isWellFormed()Проверить структуру после обхода всего файла.- Returns:
- все инструкции закрыты, альтернативы упорядочены и условия не содержат ошибок парсера.
-