Skip to content

Wrong types when using builder pattern from Java #21524

Open
@wjoel

Description

@wjoel

Compiler version

3.4.3, and all previous versions of Scala 3 that I've tested. Crashes on 3.5.0, fixed by #21522, but it has the same (wrong) types as 3.4.3 after that fix.

Minimized code

//> using dep io.github.jwharm.javagi:gtk:0.10.2

import org.gnome.gtk.{Unit => _, _}

object Main {
  val w = Box.builder() // widget
    .setOrientation(Orientation.VERTICAL)
    .setHalign(Align.START)
    .build()
  val b1 = Box.builder() // box
    .setHalign(Align.START)
    .build()
  val b2 = Box.builder() // box
    .setOrientation(Orientation.VERTICAL)
    .setHomogeneous(true)
    .setHalign(Align.START)
    .build()
  val b3 = Box.builder() // box
    .setHalign(Align.START)
    .setHomogeneous(true)
    .build()
  val error1 = Box.builder() // error
    .setOrientation(Orientation.VERTICAL)
    .setHalign(Align.START)
    .setHomogeneous(true)
    .build()
  val error2 = Box.builder() // error
    .setHalign(Align.START)
    .setOrientation(Orientation.VERTICAL)
    .build()
}

Output

Compiling project (Scala 3.4.3, JVM (22))
[error] ./Main.scala:23:16
[error] value setHomogeneous is not a member of org.gnome.gtk.Box#Builder[? <: org.gnome.gtk.Box#Builder[?]]#B#B²
[error] 
[error] where:    B  is a type in trait Builder² with bounds <: io.github.jwharm.javagi.gobject.Builder³[B]
[error]           B² is a type in class Builder⁴ with bounds <: org.gnome.gtk.Widget#Builder⁴[B²]
[error] ./Main.scala:28:16
[error] value build is not a member of org.gnome.gtk.Box#Builder[? <: org.gnome.gtk.Box#Builder[?]]#B#B²
[error] 
[error] where:    B  is a type in class Builder² with bounds <: org.gnome.gtk.Widget#Builder²[B]
[error]           B² is a type in trait Builder³ with bounds <: io.github.jwharm.javagi.gobject.Builder⁴[B²]
Error compiling project (Scala 3.4.3, JVM (22))
Compilation failed

Expectation

The code should compile, as it does when using Scala 2.13. Also, the type of the first assignment should be a Box (as on Scala 2, and Java), not a Widget.

I believe this may be related to #16779.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions