diff --git a/docs/managed-code-analysis.md b/docs/managed-code-analysis.md index f4f79db5f7..242a8d5732 100644 --- a/docs/managed-code-analysis.md +++ b/docs/managed-code-analysis.md @@ -398,7 +398,9 @@ name from `call_edges` and `field_accesses`. Target tokens remain build-local and are not compared across artifacts. Missing or unaligned edges and missing target names leave that facet unknown; equal names do not establish overload identity or runtime dispatch. `exception-shape` compares clause flags and -ranges, while `exception-target` compares each resolved catch type name. +ranges, while `exception-target` records changes to observed catch type names. +When those names differ but scoped identity is unavailable, the change remains +visible alongside `availability` and an identity limitation. Exception tokens remain in the source facts but are not cross-build identity; an unresolved catch type leaves that facet unknown. The method body retains the resolved `class_type` name and whether its local token identity could be diff --git a/src/domain/managed/managedMemberComparisonItems.ts b/src/domain/managed/managedMemberComparisonItems.ts index 47ba21c40c..56dd7d95d3 100644 --- a/src/domain/managed/managedMemberComparisonItems.ts +++ b/src/domain/managed/managedMemberComparisonItems.ts @@ -229,7 +229,7 @@ const compareExceptionTargets = ( if (leftRegion.class_type === null || rightRegion.class_type === null) unknown = true; else if (leftRegion.class_type !== rightRegion.class_type) changed = true; - else if ( + if ( leftRegion.class_type_identity_resolved !== true || rightRegion.class_type_identity_resolved !== true ) diff --git a/tests/boundary/providers/managed/managedMemberComparisonFromMetadata.test.ts b/tests/boundary/providers/managed/managedMemberComparisonFromMetadata.test.ts index dd76df4ad3..8e43debde4 100644 --- a/tests/boundary/providers/managed/managedMemberComparisonFromMetadata.test.ts +++ b/tests/boundary/providers/managed/managedMemberComparisonFromMetadata.test.ts @@ -246,7 +246,7 @@ describe("managed exception target comparison", () => { ); expect(differentNamesWithUnresolvedScope.methods[0]).toMatchObject({ status: "changed", - dimensions: expect.arrayContaining(["exception-target"]), + dimensions: expect.arrayContaining(["exception-target", "availability"]), }); const unresolved = compareManagedMembers(