Skip to content

Нарушение инварианта класса RuleContext: parent==null, но invokingState!=-1 #39

@coderabbitai

Description

@coderabbitai

Описание проблемы

В классе 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:

  1. src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:163new ParserRuleContext(null, 4)
  2. src/test/java/org/antlr/v4/test/tool/ExpectedTokensTest.java:170new ParserRuleContext(null, 9)
  3. src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:55new TestParserRuleContext(null, 0, 0)
  4. src/test/java/org/antlr/v4/runtime/tree/TreesTest.java:170new TestParserRuleContext(null, 0, 0)

Последствия

  1. Метод isEmpty() (строки 95-97 в RuleContext.java) проверяет только invokingState == -1, что может дать неправильный результат для контекстов с parent == null и invokingState != -1
  2. Отсутствует валидация в конструкторе, позволяющая создавать такие объекты, нарушающие инвариант
  3. Неясно, является ли это преднамеренной особенностью или багом

Необходимые действия

  1. Выяснить, почему тесты создают такие контексты и является ли это корректным поведением
  2. Если это баг в тестах — исправить тесты
  3. Если это преднамеренное поведение — обновить документацию и пересмотреть метод isEmpty() для ясности его семантики
  4. Рассмотреть добавление валидации в конструктор для обеспечения инварианта

Ссылки

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions