Skip to content

chore: update scala3Next to 3.9.0-RC4 - #3303

Draft
He-Pin wants to merge 4 commits into
apache:mainfrom
He-Pin:wip/scala3-next-3.9.0-RC1
Draft

chore: update scala3Next to 3.9.0-RC4#3303
He-Pin wants to merge 4 commits into
apache:mainfrom
He-Pin:wip/scala3-next-3.9.0-RC1

Conversation

@He-Pin

@He-Pin He-Pin commented Jul 7, 2026

Copy link
Copy Markdown
Member

Motivation

Scala 3.9.0-RC1 is available and should be tested as the next Scala version.

Modification

Update scala3Next version from 3.8.4 to 3.9.0-RC1.

Result

Build will use Scala 3.9.0-RC1 as the next Scala version.

Tests

Not run - version bump only

References

None - version bump

Motivation:
Scala 3.9.0-RC1 is available and should be tested as the next Scala version.

Modification:
Update scala3Next version from 3.8.4 to 3.9.0-RC1.

Result:
Build will use Scala 3.9.0-RC1 as the next Scala version.

Tests:
Not run - version bump only

References:
None - version bump
@He-Pin
He-Pin force-pushed the wip/scala3-next-3.9.0-RC1 branch from 449c8a7 to 82fef1a Compare July 8, 2026 18:15
@He-Pin He-Pin changed the title chore: update scala3Next to 3.9.0-RC1 chore: update scala3Next to 3.9.0-RC2 Jul 9, 2026
@He-Pin He-Pin closed this Jul 10, 2026
@He-Pin He-Pin reopened this Jul 10, 2026
@He-Pin He-Pin changed the title chore: update scala3Next to 3.9.0-RC2 chore: update scala3Next to 3.9.0-RC3 Jul 12, 2026
@He-Pin
He-Pin marked this pull request as ready for review July 12, 2026 12:21
@raboof

raboof commented Jul 19, 2026

Copy link
Copy Markdown
Member

Is this waiting for 3.9.0-RC4 or is there something that still needs investigation?

@pjfanning

Copy link
Copy Markdown
Member

there are a few bugs in 3.9.0-RC3 and they should be fixed in RC4.
scala/scala3#26531
scala/scala3#26532

@He-Pin
He-Pin marked this pull request as draft July 20, 2026 06:51
@He-Pin

He-Pin commented Jul 20, 2026

Copy link
Copy Markdown
Member Author

Not sure why there are quite many bugs in 3.9.0 release :(,let's wait for the next RC4

@He-Pin He-Pin changed the title chore: update scala3Next to 3.9.0-RC3 chore: update scala3Next to 3.9.0-RC4 Jul 23, 2026
@pjfanning

Copy link
Copy Markdown
Member

still have compile issues

[07-23 14:08:14.282] [error] /home/runner/work/pekko/pekko/actor-tests/src/test/java/org/apache/pekko/actor/AbstractFSMActorTest.java:27:17: org.apache.pekko.actor.AbstractFSMActorTest.MyFSM is not abstract and does not override abstract method org$apache$pekko$actor$FSM$_setter_$org$apache$pekko$actor$FSM$$handleEventDefault_$eq(scala.PartialFunction<org.apache.pekko.actor.FSM.Event<java.lang.String>,org.apache.pekko.actor.FSM.State<java.lang.String,java.lang.String>>) in org.apache.pekko.actor.FSM
[07-23 14:08:14.283] [error] public static class MyFSM extends AbstractFSM<String, String> {
[07-23 14:08:14.283] [error] 
[07-23 14:08:14.283] [error]     private final ActorRef probe;
[07-23 14:08:14.283] [error] 
[07-23 14:08:14.283] [error]     MyFSM(ActorRef probe) {
[07-23 14:08:14.283] [error]       this.probe = probe;
[07-23 14:08:14.283] [error]       onTransition(this::logTransition);
[07-23 14:08:14.284] [error]       startWith("start", "data");
[07-23 14:08:14.284] [error]       when("start", matchEventEquals("next", (newState, data) -> goTo(newState)));
[07-23 14:08:14.284] [error]       when("next", AbstractFSM.NullFunction());
[07-23 14:08:14.284] [error]       initialize();
[07-23 14:08:14.284] [error]     }
[07-23 14:08:14.284] [error] 
[07-23 14:08:14.284] [error]     private void logTransition(final String s1, final String s2) {
[07-23 14:08:14.284] [error]       probe.tell("Transitioning from %1$s to %2$s.".formatted(s1, s2), getSelf());
[07-23 14:08:14.284] [error]     }
[07-23 14:08:14.284] [error]   }
[07-23 14:08:14.284] [error]                 ^
[07-23 14:08:14.778] [info] compiling 44 Scala sources and 1 Java source to /home/runner/work/pekko/pekko/persistence/target/scala-3.9.0-RC4/test-classes ...
[07-23 14:08:20.211] [error] /home/runner/work/pekko/pekko/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java:28:17: org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.WebStoreCustomerFSM is not abstract and does not override abstract method org$apache$pekko$persistence$fsm$PersistentFSMBase$_setter_$org$apache$pekko$persistence$fsm$PersistentFSMBase$$handleEventDefault_$eq(scala.PartialFunction<org.apache.pekko.persistence.fsm.PersistentFSM.Event<org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.WebStoreCustomerFSM.ShoppingCart>,org.apache.pekko.persistence.fsm.PersistentFSM.State<org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.WebStoreCustomerFSM.UserState,org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.WebStoreCustomerFSM.ShoppingCart,org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.WebStoreCustomerFSM.DomainEvent>>) in org.apache.pekko.persistence.fsm.PersistentFSMBase
[07-23 14:08:20.211] [error] public static class WebStoreCustomerFSM
[07-23 14:08:20.212] [error]       extends AbstractPersistentFSM<
[07-23 14:08:20.212] [error]           WebStoreCustomerFSM.UserState,
[07-23 14:08:20.212] [error]           WebStoreCustomerFSM.ShoppingCart,
[07-23 14:08:20.212] [error]           WebStoreCustomerFSM.DomainEvent> {
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]     // State name
[07-23 14:08:20.212] [error]     // #customer-states
[07-23 14:08:20.212] [error]     enum UserState implements PersistentFSM.FSMState {
[07-23 14:08:20.212] [error]       LOOKING_AROUND("Looking Around"),
[07-23 14:08:20.212] [error]       SHOPPING("Shopping"),
[07-23 14:08:20.212] [error]       INACTIVE("Inactive"),
[07-23 14:08:20.212] [error]       PAID("Paid");
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       private final String stateIdentifier;
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       UserState(String stateIdentifier) {
[07-23 14:08:20.212] [error]         this.stateIdentifier = stateIdentifier;
[07-23 14:08:20.212] [error]       }
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       @Override
[07-23 14:08:20.212] [error]       public String identifier() {
[07-23 14:08:20.212] [error]         return stateIdentifier;
[07-23 14:08:20.212] [error]       }
[07-23 14:08:20.212] [error]     }
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]     // #customer-states
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]     // #customer-states-data
[07-23 14:08:20.212] [error]     public static class ShoppingCart {
[07-23 14:08:20.212] [error]       private final List<Item> items = new ArrayList<>();
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       public ShoppingCart(Item initialItem) {
[07-23 14:08:20.212] [error]         items.add(initialItem);
[07-23 14:08:20.212] [error]       }
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       public ShoppingCart() {}
[07-23 14:08:20.212] [error] 
[07-23 14:08:20.212] [error]       public List<Item> getItems() {
[07-23 14:08:20.212] [error]         return List.copyOf(items);
[07-23 14:08:20.212] [error]       }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]       public ShoppingCart addItem(Item item) {
[07-23 14:08:20.213] [error]         items.add(item);
[07-23 14:08:20.213] [error]         return this;
[07-23 14:08:20.213] [error]       }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]       public void empty() {
[07-23 14:08:20.213] [error]         items.clear();
[07-23 14:08:20.213] [error]       }
[07-23 14:08:20.213] [error]     }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     public record Item(String id, String name, float price) implements Serializable {
[07-23 14:08:20.213] [error]       @Override
[07-23 14:08:20.213] [error]       public String toString() {
[07-23 14:08:20.213] [error]         return "Item{id=%s, name=%s, price=%s}".formatted(id, price, name);
[07-23 14:08:20.213] [error]       }
[07-23 14:08:20.213] [error]     }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     // #customer-states-data
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     public interface Command {}
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     // #customer-commands
[07-23 14:08:20.213] [error]     public record AddItem(Item item) implements Command {}
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     public enum Buy implements Command {
[07-23 14:08:20.213] [error]       INSTANCE
[07-23 14:08:20.213] [error]     }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     public enum Leave implements Command {
[07-23 14:08:20.213] [error]       INSTANCE
[07-23 14:08:20.213] [error]     }
[07-23 14:08:20.213] [error] 
[07-23 14:08:20.213] [error]     public enum GetCurrentCart implements Command {
[07-23 14:08:20.213] [error]       INSTANCE
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     // #customer-commands
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public interface DomainEvent extends Serializable {}
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     // #customer-domain-events
[07-23 14:08:20.214] [error]     public record ItemAdded(Item item) implements DomainEvent {}
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public enum OrderExecuted implements DomainEvent {
[07-23 14:08:20.214] [error]       INSTANCE
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public enum OrderDiscarded implements DomainEvent {
[07-23 14:08:20.214] [error]       INSTANCE
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     // #customer-domain-events
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public enum CustomerInactive implements DomainEvent {
[07-23 14:08:20.214] [error]       INSTANCE
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     // Side effects - report events to be sent to some "Report Actor"
[07-23 14:08:20.214] [error]     public interface ReportEvent {}
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public record PurchaseWasMade(List<Item> items) implements ReportEvent {}
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     public enum ShoppingCardDiscarded implements ReportEvent {
[07-23 14:08:20.214] [error]       INSTANCE
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     private final String persistenceId;
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     @Override
[07-23 14:08:20.214] [error]     public Class<DomainEvent> domainEventClass() {
[07-23 14:08:20.214] [error]       return DomainEvent.class;
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.214] [error] 
[07-23 14:08:20.214] [error]     @Override
[07-23 14:08:20.214] [error]     public String persistenceId() {
[07-23 14:08:20.214] [error]       return persistenceId;
[07-23 14:08:20.214] [error]     }
[07-23 14:08:20.215] [error] 
[07-23 14:08:20.215] [error]     public static Props props(String persistenceId, ActorRef reportActor) {
[07-23 14:08:20.215] [error]       return Props.create(WebStoreCustomerFSM.class, persistenceId, reportActor);
[07-23 14:08:20.215] [error]     }
[07-23 14:08:20.215] [error] 
[07-23 14:08:20.215] [error]     public WebStoreCustomerFSM(String persistenceId, ActorRef reportActor) {
[07-23 14:08:20.215] [error]       this.persistenceId = persistenceId;
[07-23 14:08:20.215] [error] 
[07-23 14:08:20.215] [error]       // #customer-fsm-body
[07-23 14:08:20.215] [error]       startWith(UserState.LOOKING_AROUND, new ShoppingCart());
[07-23 14:08:20.215] [error] 
[07-23 14:08:20.215] [error]       when(
[07-23 14:08:20.215] [error]           UserState.LOOKING_AROUND,
[07-23 14:08:20.215] [error]           matchEvent(
[07-23 14:08:20.215] [error]                   AddItem.class,
[07-23 14:08:20.215] [error]                   (event, data) ->
[07-23 14:08:20.215] [error]                       goTo(UserState.SHOPPING)
[07-23 14:08:20.215] [error]                           .applying(new ItemAdded(event.item()))
[07-23 14:08:20.215] [error]                           .forMax(Duration.ofSeconds(1)))
[07-23 14:08:20.215] [error]               .event(GetCurrentCart.class, (event, data) -> stay().replying(data)));
[07-23 14:08:20.215] [error] 
[07-23 14:08:20.215] [error]       when(
[07-23 14:08:20.215] [error]           UserState.SHOPPING,
[07-23 14:08:20.215] [error]           matchEvent(
[07-23 14:08:20.215] [error]                   AddItem.class,
[07-23 14:08:20.215] [error]                   (event, data) ->
[07-23 14:08:20.215] [error]                       stay().applying(new ItemAdded(event.item())).forMax(Duration.ofSeconds(1)))
[07-23 14:08:20.215] [error]               .event(
[07-23 14:08:20.215] [error]                   Buy.class,
[07-23 14:08:20.215] [error]                   // #customer-andthen-example
[07-23 14:08:20.215] [error]                   (event, data) ->
[07-23 14:08:20.215] [error]                       goTo(UserState.PAID)
[07-23 14:08:20.215] [error]                           .applying(OrderExecuted.INSTANCE)
[07-23 14:08:20.215] [error]                           .andThen(
[07-23 14:08:20.215] [error]                               exec(
[07-23 14:08:20.215] [error]                                   cart -> {
[07-23 14:08:20.215] [error]                                     reportActor.tell(new PurchaseWasMade(cart.getItems()), self());
[07-23 14:08:20.215] [error]                                     // #customer-andthen-example
[07-23 14:08:20.215] [error]                                     saveStateSnapshot();
[07-23 14:08:20.215] [error]                                     // #customer-andthen-example
[07-23 14:08:20.215] [error]                                   })))
[07-23 14:08:20.215] [error]               // #customer-andthen-example
[07-23 14:08:20.215] [error]               .event(
[07-23 14:08:20.215] [error]                   Leave.class,
[07-23 14:08:20.215] [error]                   // #customer-snapshot-example
[07-23 14:08:20.215] [error]                   (event, data) ->
[07-23 14:08:20.215] [error]                       stop()
[07-23 14:08:20.215] [error]                           .applying(OrderDiscarded.INSTANCE)
[07-23 14:08:20.215] [error]                           .andThen(
[07-23 14:08:20.215] [error]                               exec(
[07-23 14:08:20.215] [error]                                   cart -> {
[07-23 14:08:20.215] [error]                                     reportActor.tell(ShoppingCardDiscarded.INSTANCE, self());
[07-23 14:08:20.215] [error]                                     saveStateSnapshot();
[07-23 14:08:20.215] [error]                                   })))
[07-23 14:08:20.215] [error]               // #customer-snapshot-example
[07-23 14:08:20.216] [error]               .event(GetCurrentCart.class, (event, data) -> stay().replying(data))
[07-23 14:08:20.216] [error]               .event(
[07-23 14:08:20.216] [error]                   StateTimeout$.class,
[07-23 14:08:20.216] [error]                   (event, data) -> goTo(UserState.INACTIVE).forMax(Duration.ofSeconds(2))));
[07-23 14:08:20.216] [error] 
[07-23 14:08:20.216] [error]       when(
[07-23 14:08:20.216] [error]           UserState.INACTIVE,
[07-23 14:08:20.216] [error]           matchEvent(
[07-23 14:08:20.216] [error]                   AddItem.class,
[07-23 14:08:20.216] [error]                   (event, data) ->
[07-23 14:08:20.216] [error]                       goTo(UserState.SHOPPING)
[07-23 14:08:20.216] [error]                           .applying(new ItemAdded(event.item()))
[07-23 14:08:20.216] [error]                           .forMax(Duration.ofSeconds(1)))
[07-23 14:08:20.216] [error]               .event(GetCurrentCart.class, (event, data) -> stay().replying(data))
[07-23 14:08:20.216] [error]               .event(
[07-23 14:08:20.216] [error]                   StateTimeout$.class,
[07-23 14:08:20.216] [error]                   (event, data) ->
[07-23 14:08:20.216] [error]                       stop()
[07-23 14:08:20.216] [error]                           .applying(OrderDiscarded.INSTANCE)
[07-23 14:08:20.216] [error]                           .andThen(
[07-23 14:08:20.216] [error]                               exec(
[07-23 14:08:20.216] [error]                                   cart ->
[07-23 14:08:20.216] [error]                                       reportActor.tell(ShoppingCardDiscarded.INSTANCE, self())))));
[07-23 14:08:20.216] [error] 
[07-23 14:08:20.216] [error]       when(
[07-23 14:08:20.216] [error]           UserState.PAID,
[07-23 14:08:20.216] [error]           matchEvent(Leave.class, (event, data) -> stop())
[07-23 14:08:20.216] [error]               .event(GetCurrentCart.class, (event, data) -> stay().replying(data)));
[07-23 14:08:20.216] [error]       // #customer-fsm-body
[07-23 14:08:20.216] [error]     }
[07-23 14:08:20.216] [error] 
[07-23 14:08:20.216] [error]     /**
[07-23 14:08:20.216] [error]      * Override this handler to define the action on Domain Event during recovery
[07-23 14:08:20.216] [error]      *
[07-23 14:08:20.216] [error]      * @param event domain event to apply
[07-23 14:08:20.216] [error]      * @param currentData state data of the previous state
[07-23 14:08:20.216] [error]      */
[07-23 14:08:20.216] [error]     // #customer-apply-event
[07-23 14:08:20.216] [error]     @Override
[07-23 14:08:20.216] [error]     public ShoppingCart applyEvent(DomainEvent event, ShoppingCart currentData) {
[07-23 14:08:20.216] [error]       if (event instanceof ItemAdded itemAdded) {
[07-23 14:08:20.216] [error]         currentData.addItem(itemAdded.item());
[07-23 14:08:20.216] [error]         return currentData;
[07-23 14:08:20.216] [error]       } else if (event instanceof OrderExecuted) {
[07-23 14:08:20.216] [error]         return currentData;
[07-23 14:08:20.216] [error]       } else if (event instanceof OrderDiscarded) {
[07-23 14:08:20.216] [error]         currentData.empty();
[07-23 14:08:20.216] [error]         return currentData;
[07-23 14:08:20.216] [error]       }
[07-23 14:08:20.216] [error]       throw new RuntimeException("Unhandled");
[07-23 14:08:20.217] [error]     }
[07-23 14:08:20.217] [error]     // #customer-apply-event
[07-23 14:08:20.217] [error]   }
[07-23 14:08:20.217] [error]                 ^
[07-23 14:08:20.267] [error] /home/runner/work/pekko/pekko/persistence/src/test/java/org/apache/pekko/persistence/fsm/AbstractPersistentFSMTest.java:265:17: org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.PFSMwithLog is not abstract and does not override abstract method org$apache$pekko$persistence$fsm$PersistentFSMBase$_setter_$org$apache$pekko$persistence$fsm$PersistentFSMBase$$handleEventDefault_$eq(scala.PartialFunction<org.apache.pekko.persistence.fsm.PersistentFSM.Event<java.lang.Integer>,org.apache.pekko.persistence.fsm.PersistentFSM.State<org.apache.pekko.persistence.fsm.AbstractPersistentFSMTest.PFSMState,java.lang.Integer,java.lang.Integer>>) in org.apache.pekko.persistence.fsm.PersistentFSMBase
[07-23 14:08:20.267] [error] public static class PFSMwithLog extends AbstractPersistentFSM<PFSMState, Integer, Integer> {
[07-23 14:08:20.267] [error]     {
[07-23 14:08:20.267] [error]       startWith(PFSMState.STARTED, 0);
[07-23 14:08:20.267] [error] 
[07-23 14:08:20.267] [error]       when(
[07-23 14:08:20.267] [error]           PFSMState.STARTED,
[07-23 14:08:20.267] [error]           matchEvent(
[07-23 14:08:20.267] [error]               String.class,
[07-23 14:08:20.267] [error]               (command, currentData) -> {
[07-23 14:08:20.267] [error]                 sender().tell("started", getSelf());
[07-23 14:08:20.267] [error]                 return stay();
[07-23 14:08:20.267] [error]               }));
[07-23 14:08:20.267] [error] 
[07-23 14:08:20.267] [error]       onTransition(this::transitionLogger); // this is tested command
[07-23 14:08:20.267] [error]     }
[07-23 14:08:20.267] [error] 
[07-23 14:08:20.268] [error]     private void transitionLogger(PFSMState from, PFSMState to) {
[07-23 14:08:20.268] [error]       System.out.println("transition from " + from + " to " + to);
[07-23 14:08:20.268] [error]     }
[07-23 14:08:20.268] [error] 
[07-23 14:08:20.268] [error]     @Override
[07-23 14:08:20.268] [error]     public Class<Integer> domainEventClass() {
[07-23 14:08:20.268] [error]       return Integer.class;
[07-23 14:08:20.268] [error]     }
[07-23 14:08:20.268] [error] 
[07-23 14:08:20.268] [error]     @Override
[07-23 14:08:20.268] [error]     public Integer applyEvent(final Integer domainEvent, final Integer currentData) {
[07-23 14:08:20.268] [error]       return 0;
[07-23 14:08:20.268] [error]     }
[07-23 14:08:20.268] [error] 
[07-23 14:08:20.268] [error]     @Override
[07-23 14:08:20.268] [error]     public String persistenceId() {
[07-23 14:08:20.268] [error]       return "id";
[07-23 14:08:20.268] [error]     }
[07-23 14:08:20.268] [error]   }
[07-23 14:08:20.268] [error]                 ^

@pjfanning

Copy link
Copy Markdown
Member

@He-Pin would you have time to try to summarise the remaining compile issues for the scala3 team?

@He-Pin

He-Pin commented Jul 25, 2026

Copy link
Copy Markdown
Member Author

They are working on it now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants