Skip to content

Regression for implicit search in mixed Java/Scala compilation in scala-tsi/scala-tsi #21303

Closed as not planned
@WojciechMazur

Description

@WojciechMazur

Compiler version

Last good release: 3.6.0-RC1-bin-20240719-af933c4-NIGHTLY
First bad release: 3.6.0-RC1-bin-20240723-46ff151-NIGHTLY
Bisect points to 2facda0

Minimized code

// Test.scala

import scala.deriving.Mirror
import scala.compiletime.*
import scala.reflect.ClassTag
import scala.annotation.implicitNotFound


trait TSType[T]
object TSType extends DefaultTSTypes with TSTypeMacros

trait TSNamedType[T] extends TSType[T]

trait DefaultTSTypes extends JavaTSTypes
trait JavaTSTypes {
  implicit def javaEnumTSType[E <: java.lang.Enum[E]: ClassTag]: TSNamedType[E] = ??? 
}
object DefaultTSTypes extends DefaultTSTypes
trait TSTypeMacros {
  inline given [T: Mirror.Of]: TSType[T] = derived[T]
  inline def derived[T](using m: Mirror.Of[T]): TSType[T] = {
    val elemInstances = summonAll[m.MirroredElemTypes]
    ???
  }

  private inline def summonAll[T <: Tuple]: List[TSType[_]] = {
    inline erasedValue[T] match {
      case _: EmptyTuple => Nil
      case _: (t *: ts)  => summonInline[TSType[t]] :: summonAll[ts]
    }
  }
}

@main def Test = summon[TSType[JavaEnum]]
// JavaEnum.java
public enum JavaEnum { ABC, DEF, GHI }

Output

[error] -- [E172] Type Error: /Users/wmazur/projects/community-build3/repo/src/main/scala/com/scalatsi/TSType.scala:34:41 
[error] 34 |@main def Test = summon[TSType[JavaEnum]]
[error]    |                                         ^
[error]    |No given instance of type TSType[(JavaEnum.ABC : JavaEnum)] was found.
[error]    |I found:
[error]    |
[error]    |    TSType.given_TSType_T[(JavaEnum.ABC : JavaEnum)](
[error]    |      JavaEnum.$asInstanceOf[
[error]    |        
[error]    |          scala.deriving.Mirror.Sum{
[error]    |            type MirroredMonoType = (JavaEnum.ABC : JavaEnum);
[error]    |              type MirroredType = (JavaEnum.ABC : JavaEnum);
[error]    |              type MirroredLabel = ("JavaEnum" : String);
[error]    |              type MirroredElemTypes = ((JavaEnum.ABC : JavaEnum),
[error]    |                (JavaEnum.DEF : JavaEnum), (JavaEnum.GHI : JavaEnum));
[error]    |              type MirroredElemLabels = (("ABC" : String), ("DEF" : String),
[error]    |                ("GHI" : String))
[error]    |          }
[error]    |        
[error]    |      ]
[error]    |    )
[error]    |
[error]    |But given instance given_TSType_T in trait TSTypeMacros does not match type TSType[(JavaEnum.ABC : JavaEnum)].
[error]    |----------------------------------------------------------------------------
[error]    |Inline stack trace
[error]    |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[error]    |This location contains code that was inlined from TSType.scala:29
[error] 29 |      case _: (t *: ts)  => summonInline[TSType[t]] :: summonAll[ts]
[error]    |                            ^^^^^^^^^^^^^^^^^^^^^^^
[error]    |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[error]    |This location contains code that was inlined from TSType.scala:29
[error] 22 |    val elemInstances = summonAll[m.MirroredElemTypes]
[error]    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error]    |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[error]    |This location contains code that was inlined from TSType.scala:29
[error] 20 |  inline given [T: Mirror.Of]: TSType[T] = derived[T]
[error]    |                                           ^^^^^^^^^^
[error]     ----------------------------------------------------------------------------

When replacing

  inline given [T: Mirror.Of]: TSType[T] = derived[T]

to

  inline given [T: Mirror.Of]: TSType[T] = ???

it fails with

rror] -- [E119] Type Error: /Users/wmazur/projects/community-build3/repo/src/test/scala/com/scalatsi/EnumTests.scala:7:38 
[error] 7 |  val x = implicitly[TSType[JavaEnum]]
[error]   |                                      ^
[error]   |                                Java defined class JavaEnum is not a value

Expectation

Should choose dedicated javaEnumTSType implicit and compile

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions