Avoid source-state inference collisions across enum types

When inferring missing trigger sourceState from the transition table, preserve enum type context (Type.CONST) so different state enums sharing a constant name do not collapse into a single inferred source.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-13 21:48:15 +02:00
parent 44497afd32
commit bbfb54c51b
2 changed files with 49 additions and 17 deletions

View File

@@ -221,6 +221,36 @@ class TransitionLinkerEnricherTest {
assertThat(updatedChain.getTriggerPoint().isAmbiguous()).isFalse();
}
@Test
void shouldNotInferSourceStateWhenDifferentEnumsShareSameConstantName() {
Transition t1 = new Transition();
t1.setSourceStates(List.of(State.of("NEW", "com.example.order.OrderState.NEW")));
t1.setTargetStates(List.of(State.of("PAID", "com.example.order.OrderState.PAID")));
t1.setEvent(Event.of("PAY", "PAY"));
Transition t2 = new Transition();
t2.setSourceStates(List.of(State.of("NEW", "com.example.invoice.InvoiceState.NEW")));
t2.setTargetStates(List.of(State.of("PAID", "com.example.invoice.InvoiceState.PAID")));
t2.setEvent(Event.of("PAY", "PAY"));
CallChain chain = CallChain.builder()
.triggerPoint(TriggerPoint.builder().event("PAY").build())
.build();
AnalysisResult result = AnalysisResult.builder()
.transitions(List.of(t1, t2))
.metadata(CodebaseMetadata.builder().callChains(List.of(chain)).build())
.build();
enricher.enrich(result, null, null);
CallChain updatedChain = result.getMetadata().getCallChains().get(0);
assertThat(updatedChain.getTriggerPoint().getSourceState()).isNull();
assertThat(updatedChain.getTriggerPoint().isAmbiguous()).isTrue();
assertThat(updatedChain.getMatchedTransitions()).isNullOrEmpty();
assertThat(updatedChain.getLinkResolution()).isEqualTo(click.kamil.springstatemachineexporter.analysis.model.LinkResolution.AMBIGUOUS_WIDEN);
}
@Test
void shouldLinkTransitionByEventAndSourceState() {
Transition t1 = new Transition();