kotlinx.coroutines icon indicating copy to clipboard operation
kotlinx.coroutines copied to clipboard

Gradually introduce SubclassOptInRequired into our codebase

Open qwwdfsad opened this issue 2 years ago • 1 comments
trafficstars

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-subclass-opt-in-required/

Historically, we have multiple interfaces that are not designed for external implementation, , but are not sealed for various reasons (including historical ones):

  • Job should not be extended externally
  • Deferred and CompletableDeferred should not be extended externally
  • Channel probably should not be extended externally
    • It is not mentioned in the documentation, and it's impossible to fulfil the select's contract with a hand-rolled implementation
    • Yet it is possible to implement it with a delegation, potentially closing the possibility of adding new abstract members to the interface

  • Flow, SharedFlow, and StateFlow are unstable/experimental for inheritance
  • CloseableCoroutineDispatcher is unstable for inheritance
  • CancellableContinuation is an interface not ready to be extended

It would be nice to adopt the SubclassOptInRequired (available from 1.9.0) in the library to provide explicit programmatic warnings/errors and to prevent issues like https://github.com/Kotlin/kotlinx.coroutines/issues/3729

For "prohibited to implement" interfaces we can introduce the new annotation with a warning (or maybe even an error) and, in the next major release, make the annotation internal itself, so it would be much harder to opt-in

qwwdfsad avatar Jun 01 '23 16:06 qwwdfsad

Yet it is possible to implement [a Channel] with a delegation

Yep, even a naive search yields a couple of places: https://grep.app/search?q=by%20channel&filter[lang][0]=Kotlin

dkhalanskyjb avatar Apr 23 '24 11:04 dkhalanskyjb