Skip to content

Fix hashCode/equals contract violation in XType.hash()#275

Merged
nikolai-manzhos merged 1 commit into
mainfrom
nikolaim/ksp2
Jun 16, 2026
Merged

Fix hashCode/equals contract violation in XType.hash()#275
nikolai-manzhos merged 1 commit into
mainfrom
nikolaim/ksp2

Conversation

@nikolai-manzhos

Copy link
Copy Markdown
Collaborator

Description:
Fix hashCode/equals contract violation in XType.hash() that caused duplicate type entries in the scope graph when mixing Java and Kotlin sources after migrating to KSP2. In KSP2, equivalent parameterized types from Java and Kotlin sources produce distinct XType instances (KSP1 cached/shared them), exposing a latent bug: the else branch used identity-based hashCode() while equals() delegates to value-based isEquivalent(). Replace with typeName.removeWildcardTypeIfContains().toString().hashCode() to match the equivalence logic, and remove the now-redundant hasCollectionType branch.

Testing:
Add unit test that reproduces the bug using mixed Java+Kotlin sources returning the same parameterized type (Wrapper)

The `else` branch of `hash()` was using identity-based `hashCode()`, while `isEquivalent()` (used by `equals()`) performed value-based comparison via `typeName`. This caused equivalent XType instances — particularly those originating from mixed Java and Kotlin sources in KSP — to produce different hash codes, breaking HashMap deduplication in the scope graph.

Replace the identity `hashCode()` with `typeName.removeWildcardTypeIfContains().toString().hashCode()` to match the equivalence logic, and remove the now-redundant `hasCollectionType` branch which did the same thing.
@CLAassistant

CLAassistant commented Jun 15, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@nikolai-manzhos nikolai-manzhos requested a review from ryanulep June 15, 2026 12:47
@jbarr21 jbarr21 self-requested a review June 16, 2026 02:42
@nikolai-manzhos nikolai-manzhos merged commit f68399c into main Jun 16, 2026
5 checks passed
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.

4 participants