Skip to content

Fix collisions between same-named fields - #327

Merged
rcosta358 merged 7 commits into
mainfrom
codex/issue-318-field-identity
Oct 6, 2026
Merged

rcosta358 merged 7 commits into
mainfrom
codex/issue-318-field-identity

Conversation

@rcosta358

@rcosta358 rcosta358 commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #318 and #315.

Qualifies field names by declaring class, adds a combined nested-field regression, and fixes negative literal initializers.

Tests: TestExamples (201 passed).

This PR was generated by Codex.

@CatarinaGamboa CatarinaGamboa left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor followup

}

public static String qualifyFieldName(CtFieldReference<?> field) {
return "this#" + field.getDeclaringType().getQualifiedName() + "." + field.getSimpleName();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i wonder if we can also remove the # in the middle here and use the . so its more like java and less our workaround.

@rcosta358 rcosta358 Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had thought about that but that requires changing the grammar and will cause conflicts but we can give it a shot.

@rcosta358
rcosta358 changed the base branch from codex/issue-317-nested-context to main October 6, 2026 15:17
@rcosta358
rcosta358 merged commit e690903 into main Oct 6, 2026
2 checks passed
@rcosta358
rcosta358 deleted the codex/issue-318-field-identity branch October 13, 2026 16:56
CatarinaGamboa added a commit that referenced this pull request Oct 20, 2026
Fixes #321, fixes #322.

Field reads could pick up the refinement of the wrong variable, so real
violations passed:

- **#321:** `visitCtFieldRead` first looked a field up by its simple
name. Since #327 fields are stored only under their qualified name
(`this#<DeclaringType>.<name>`), that lookup could only find a local
with the same name, so `Format.JPG` read a local `JPG`. That branch is
removed.
- **#322:** `Limits.max` already resolves correctly on main thanks to
#327's qualified names; this PR adds a regression fixture. `other.val`
still used the tracked `this#C.val`, which holds the current object's
value. The new `Utils.accessesTrackedField` is true only for static
fields and `this`, `super` and `Outer.this` targets; reads on any other
object now use the field's declared refinement, which is checked at
every write and so holds for every instance. This applies to field
reads, binary-operation operands (including `if` conditions, which
previously also overwrote what was known about `this.val`) and compound
assignments such as `j += other.val`.

Fixtures: `ErrorFieldOfOtherClass`, `ErrorFieldOfOtherObject` (plain
read, sum, `+=`, `if` condition), `ErrorLocalShadowsConstant` (enum
constant and `static final int`), and the control
`CorrectFieldReadResolution`. Without the fix the two latter Error
fixtures pass verification and the control gives a false error.

Not fixed here (writes, needs its own issue): `other.val = 9` is checked
against the declared refinement but also updates `this#C.val`, so `val =
7; other.val = 9;` then `@Refinement("_ == 9") int k = val;` verifies.
The same write path handles `other.val++`, compound assignments, and the
typestate ghost-field update in `AuxStateHandler.updateGhostField`,
which assumes `this`.

Also observed: test files that each declare an enum with the same simple
name can clash within one JVM run ("Sorts ...A$Format and ...B$Format
are incompatible"), so some state persists across test files. The
fixtures use distinct enum names to avoid it.

Validation: `mvn test` passes all 414 tests (253 TestExamples cases).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fields with the same name in different classes collide Handle refinements in nested classes

2 participants