Defer polymorphic qualification to linker with context

Stop rewriting polymorphic events in TriggerPoint construction without ambiguity context; canonicalize labels at link time while preserving type FQNs for shared-infrastructure routing.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-14 06:09:00 +02:00
parent bd9136a45c
commit 5c0d9c466d
5 changed files with 64 additions and 7 deletions

View File

@@ -1,5 +1,6 @@
package click.kamil.springstatemachineexporter.analysis.resolver;
import click.kamil.springstatemachineexporter.analysis.model.TriggerPoint;
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@@ -64,4 +65,31 @@ class MachineEnumCanonicalizerCrossPackageTest {
"a.OrderEvent",
context)).isEmpty();
}
@Test
void shouldCanonicalizeLabelsForLinkingWithoutOverwritingTypeFqns(@TempDir Path tempDir) throws Exception {
Files.createDirectories(tempDir.resolve("com/example/order"));
Files.writeString(tempDir.resolve("com/example/order/OrderEvent.java"),
"package com.example.order; public enum OrderEvent { PAY, SHIP }");
Files.writeString(tempDir.resolve("App.java"), "package com.example; class App {}");
CodebaseContext context = new CodebaseContext();
context.scan(tempDir);
TriggerPoint trigger = TriggerPoint.builder()
.event("OrderEvent.valueOf(action)")
.polymorphicEvents(List.of("OrderEvent.PAY", "OrderEvent.SHIP"))
.build();
StateMachineTypeResolver.MachineTypes types = new StateMachineTypeResolver.MachineTypes(
"com.example.order.OrderState", "com.example.order.OrderEvent");
TriggerPoint linked = MachineEnumCanonicalizer.canonicalizeTriggerLabelsForLinking(
trigger, types, context);
assertThat(linked.getEventTypeFqn()).isNull();
assertThat(linked.getStateTypeFqn()).isNull();
assertThat(linked.getPolymorphicEvents()).containsExactly(
"com.example.order.OrderEvent.PAY",
"com.example.order.OrderEvent.SHIP");
}
}