Skip to content

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

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

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions