Thread context through transition and state canonicalization

Machine-scoped transition/state labels and polymorphic event harvesting now use context-aware canonicalizeLabel so ambiguous import-style enum names are not rewritten during export or validation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-14 06:33:37 +02:00
parent dbeab64e1b
commit d11f8afd79
5 changed files with 86 additions and 24 deletions

View File

@@ -110,4 +110,35 @@ class MachineEnumCanonicalizerCrossPackageTest {
assertThat(MachineEnumCanonicalizer.isMachineEnumReference(
"OrderEvent.PAY", "a.OrderEvent", context)).isFalse();
}
@Test
void shouldNotCanonicalizeAmbiguousImportStyleTransitionEvents(@TempDir Path tempDir) throws Exception {
Files.createDirectories(tempDir.resolve("a"));
Files.createDirectories(tempDir.resolve("b"));
Files.writeString(tempDir.resolve("a/OrderEvent.java"),
"package a; public enum OrderEvent { PAY }");
Files.writeString(tempDir.resolve("b/OrderEvent.java"),
"package b; public enum OrderEvent { CANCEL }");
Files.writeString(tempDir.resolve("a/OrderState.java"),
"package a; public enum OrderState { NEW, PAID }");
CodebaseContext context = new CodebaseContext();
context.scan(tempDir);
click.kamil.springstatemachineexporter.model.Transition transition =
new click.kamil.springstatemachineexporter.model.Transition();
transition.setEvent(click.kamil.springstatemachineexporter.model.Event.of(
"OrderEvent.PAY", "OrderEvent.PAY"));
transition.setSourceStates(List.of(click.kamil.springstatemachineexporter.model.State.of(
"OrderState.NEW", "OrderState.NEW")));
transition.setTargetStates(List.of(click.kamil.springstatemachineexporter.model.State.of(
"OrderState.PAID", "OrderState.PAID")));
StateMachineTypeResolver.MachineTypes types = new StateMachineTypeResolver.MachineTypes(
"a.OrderState", "a.OrderEvent");
MachineEnumCanonicalizer.canonicalizeTransitions(List.of(transition), types, context);
assertThat(transition.getEvent().fullIdentifier()).isEqualTo("OrderEvent.PAY");
assertThat(transition.getSourceStates().get(0).fullIdentifier()).isEqualTo("a.OrderState.NEW");
}
}