eed3si9n / scalaxb

scalaxb is an XML data binding tool for Scala.
http://scalaxb.org/
MIT License
335 stars 154 forks source link

Enumerate all transitive self types in generated SOAP bindings #595

Closed fthomas closed 1 year ago

fthomas commented 1 year ago

Problem

In Scala 3 the self type must enumerate all transitive self types. That means that generated code like this is rejected by the Scala 3 compiler:

trait HttpClients {}
trait Soap11Clients { this: HttpClients => }
trait FooSoapBindings { this: Soap11Clients => }

It complains with:

[error] -- [E058] Type Mismatch Error: Test.scala:6:8
[error] 6 |  trait FooSoapBindings { this: Soap11Clients => } // error
[error]   |        ^
[error]   |missing requirement: self type Soap11Clients & FooSoapBindings of trait FooSoapBindings does not conform to self type HttpClients
[error]   |of required trait Soap11Clients

Solution

The solution is to add scalaxb.HttpClients (or scalaxb.HttpClientsAsync) to the self type of the generated SOAP bindings. Scala 2 is still happy with this change and Scala 3 is now able to compile the generated bindings.

I've tested these changes by publishing this branch locally and by using the local sbt-scalaxb 1.9.1-SNAPSHOT plugin to generate code that was then compiled with Scala 3.2.2. It compiled successfully with both scalaxbAsync := true and false.

Closes: #557

fthomas commented 1 year ago

Thanks for releasing this so quickly @eed3si9n!