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. Рассмотреть добавление валидации в конструктор для обеспечения инварианта

Ссылки

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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