Описание проблемы
В классе RuleContext документирован инвариант, согласно которому корневые узлы должны иметь parent == null И invokingState == -1. Однако, в тестовом коде обнаружены случаи нарушения этого инварианта.
Документация утверждает
Из Javadoc класса RuleContext:
- Строка 42: "If parent is null, this should be -1"
- Строка 36: "The root node always has a null pointer and invokingState of -1"
Обнаруженные нарушения
Найдены случаи создания контекстов с parent == null, но invokingState != -1:
src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:163 — new ParserRuleContext(null, 4)
src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:170 — new ParserRuleContext(null, 9)
src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:55 — new TestParserRuleContext(null, 0, 0)
src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:170 — new TestParserRuleContext(null, 0, 0)
Последствия
- Метод
isEmpty() (строки 95-97 в RuleContext.java) проверяет только invokingState == -1, что может дать неправильный результат для контекстов с parent == null и invokingState != -1
- Отсутствует валидация в конструкторе, позволяющая создавать такие объекты, нарушающие инвариант
- Неясно, является ли это преднамеренной особенностью или багом
Необходимые действия
- Выяснить, почему тесты создают такие контексты и является ли это корректным поведением
- Если это баг в тестах — исправить тесты
- Если это преднамеренное поведение — обновить документацию и пересмотреть метод
isEmpty() для ясности его семантики
- Рассмотреть добавление валидации в конструктор для обеспечения инварианта
Ссылки
Описание проблемы
В классе
RuleContextдокументирован инвариант, согласно которому корневые узлы должны иметьparent == nullИinvokingState == -1. Однако, в тестовом коде обнаружены случаи нарушения этого инварианта.Документация утверждает
Из Javadoc класса
RuleContext:Обнаруженные нарушения
Найдены случаи создания контекстов с
parent == null, ноinvokingState != -1:src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:163—new ParserRuleContext(null, 4)src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:170—new ParserRuleContext(null, 9)src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:55—new TestParserRuleContext(null, 0, 0)src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:170—new TestParserRuleContext(null, 0, 0)Последствия
isEmpty()(строки 95-97 в RuleContext.java) проверяет толькоinvokingState == -1, что может дать неправильный результат для контекстов сparent == nullиinvokingState != -1Необходимые действия
isEmpty()для ясности его семантикиСсылки