)]}'
{
  "commit": "ad7aa49497a09455b47dfc80bdbdb7a7a138345a",
  "tree": "7cbb8d5b2ffead6d148e47e3448bdc055fa58a00",
  "parents": [
    "b5f617baa90628db16dddcd5c10c97398b0fa891"
  ],
  "author": {
    "name": "Alexey Belkov",
    "email": "alexey.belkov@jetbrains.com",
    "time": "Thu Aug 27 15:31:52 2026 +0400"
  },
  "committer": {
    "name": "Alexey Belkov",
    "email": "alexey.belkov@jetbrains.com",
    "time": "Tue Sep 01 16:34:58 2026 +0400"
  },
  "message": "[SLC] Drop regular declarations shadowed by boxed ones\n\nSymbol light classes materialized both the regular declaration and the\none requested by @JvmExposeBoxed whenever a value class was involved,\nwithout checking whether the two end up with the same JVM signature.\nJava resolve was then offered duplicate candidates that cannot coexist\nin a class file: `ExposedResult` got two `consume(Result)` methods, and\n`Test(StringWrapper?)` got a private regular constructor next to the\npublic exposed one with the very same descriptor. Compiling the\nfixtures and reading `javap` confirms that the backend emits a single\ndeclaration in both cases.\n\nBoxing normally does change the signature, so both declarations have to\nstay. Only two shapes collapse, and the JVM backend special-cases each:\n\n- `kotlin.Result` is the only value class excluded from name mangling,\n  and a nullable one is already mapped to `kotlin/Result`, so nothing\n  tells the two methods apart unless @JvmExposeBoxed renames the boxed\n  one - see `acceptsNullableResultWithoutRenaming`;\n- a constructor cannot be renamed, so it is distinguishable by its\n  parameter types alone, and a nullable value class leaves nothing to\n  box - see `isBoxedInlineClassType`.\n\nMirror these two rules rather than compare computed JVM identities: an\nidentity comparison disagrees with the backend both ways. Keyed on the\nname and the parameters it would also drop `int jvmMemberLevel()` next\nto `IntWrapper jvmMemberLevel()`, which the backend keeps; keyed on the\nreturn type as well it would keep a regular constructor taking the\nunboxed `String` of a nullable `StringWrapper`, which the backend never\nemits. Mirroring is cheaper, too: parameter types are already inspected\non this path, and the new check runs only when both declarations are\notherwise required.\n\nThe `resultNullable`, `constructorBoxed` and `dataClassWithValueClass`\ngoldens lose their duplicates and now agree with their `.lib.java`\ncounterparts. New fixtures pin the boundaries: `resultNullableVariable`\nfor accessors, where only a receiver, a context parameter or the\nproperty type of a setter can clash; `resultNullableMangled` for a\nnullable `Result` accompanied by a mangling value class, a non-null\n`Result` or a non-null type parameter; `constructorBoxedMixed` for a\nconstructor that still has something left to box; and\n`jvmNameResultNullable` for @JvmName pulling a return-type-mangled name\nback onto the boxed one.\n\nDrop the problem description that tracked this divergence.\n",
  "tree_diff": [
    {
      "type": "delete",
      "old_id": "5a4170a4d223fcb2a47067f6de0c18bf7379886f",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/docs/jvm-expose-boxed-identical-signature-collisions.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "4ef9127ff1d84f701ff14b4d10b087bbe8f1988a",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt",
      "new_id": "5c2b37984960796c021a46bb750707541b28a320",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt"
    },
    {
      "type": "modify",
      "old_id": "f925e90befc88326a25456924e2657363201d2be",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt",
      "new_id": "19e70028dc627f83d56afb3eef8bfcb90f25e268",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt"
    },
    {
      "type": "modify",
      "old_id": "fea46bb2f14759b618fcbec3e21a00699331aba6",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt",
      "new_id": "f2a9295935a07498a451fc91e40c1320eb84668e",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt"
    },
    {
      "type": "modify",
      "old_id": "bd89ae7c556d8f62a5329851f518c701695a150d",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt",
      "new_id": "f5c2ffc222db9d1bf2d70a13376a5fd5552cfa4d",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt"
    },
    {
      "type": "modify",
      "old_id": "2a47047e9211ba0f6ac9b80b950ad36b2aee59ee",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt",
      "new_id": "bf43dd08a06888ebe3b7d76cf8e974f489fb40fb",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt"
    },
    {
      "type": "modify",
      "old_id": "4f1d74f828b68cbda9f0fba2e83b1c75f862f70d",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/constructorBoxed.java",
      "new_id": "ee49453bd35b05ef2305bc4c16a76e0756fe2354",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/constructorBoxed.java"
    },
    {
      "type": "modify",
      "old_id": "79ca363e1cd354a3d8e057ef2da737ef744e34e0",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/constructorBoxedMixed.java",
      "new_id": "ff17150b314ab0076286e6d5894014609797702b",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/constructorBoxedMixed.java"
    },
    {
      "type": "modify",
      "old_id": "4f1d74f828b68cbda9f0fba2e83b1c75f862f70d",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/constructorBoxed.java",
      "new_id": "ee49453bd35b05ef2305bc4c16a76e0756fe2354",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/constructorBoxed.java"
    },
    {
      "type": "modify",
      "old_id": "d9fa1429c7d9df999bc3fbe072438ba43ba7eedc",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/constructorBoxed.kmp.java",
      "new_id": "9b1d62ec4573c15465c2d647c2f104c2083bb497",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/constructorBoxed.kmp.java"
    },
    {
      "type": "modify",
      "old_id": "9d3e0d5b98f1f646079a7412ffc339763cf901db",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/dataClassWithValueClass.java",
      "new_id": "93d112d8bfeb7896432fdaad8aa5b5b8f394ade7",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/dataClassWithValueClass.java"
    },
    {
      "type": "modify",
      "old_id": "9612f11d9014b8e7f323a65dfc2bb55d807f411c",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/dataClassWithValueClass.kmp.java",
      "new_id": "4f7d53b5499f8e80c3aac0ee045cf3051cb7b0b1",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/dataClassWithValueClass.kmp.java"
    },
    {
      "type": "modify",
      "old_id": "89ab9d05d9d8bbe264946aa911a1984052a2fc60",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/resultNullable.java",
      "new_id": "01d9b8c1647afa3cd83e619c9fbb4f715697620a",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/resultNullable.java"
    },
    {
      "type": "modify",
      "old_id": "cf7eba6e1ca396bdd244bd20231b2634d0893393",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/resultNullable.kmp.java",
      "new_id": "85f38ef12db9dd6ae636911977636cd6378ad93c",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/directive/resultNullable.kmp.java"
    },
    {
      "type": "modify",
      "old_id": "be2092dc8d09a29a22aa1ff9ae35efd247e3474d",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/featureInteraction/jvmNameResultNullable.java",
      "new_id": "eaba8971ba9421c280aeada80405adcb2f84e5bc",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/featureInteraction/jvmNameResultNullable.java"
    },
    {
      "type": "modify",
      "old_id": "34d02d3660070774cfc9b3e64ad93792ffc1f587",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullable.java",
      "new_id": "88f55e4fc3c43b834fec7244e248eb8db486e177",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullable.java"
    },
    {
      "type": "modify",
      "old_id": "acf01e89db0d9b834937f0862a1a711ef9e993b5",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullableMangled.java",
      "new_id": "2076b033af8f49b41857cbf4bce32f2eea7cf0b0",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullableMangled.java"
    },
    {
      "type": "modify",
      "old_id": "69c73b2a944597ac3c95deef4da1da7d36b5570a",
      "old_mode": 33188,
      "old_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullableVariable.java",
      "new_id": "f24ccb0bf1c6a159dcb604f7f4cee789790c3dc8",
      "new_mode": 33188,
      "new_path": "analysis/symbol-light-classes/testData/lightClassByPsi/jvmExposeBoxed/resultNullableVariable.java"
    }
  ]
}
