`java.sql.Driver` missing from classpath in macro in presentation compiler
kasiaMarek opened this issue · 1 comments
kasiaMarek commented
Original issue: scalameta/metals#6494
Compiler version
3.4.2
Minimized code
//> using scala "3.4.2"
//> using dep "com.h2database:h2:2.2.224"
import scala.quoted._
class LoadStuff extends Selectable:
def selectDynamic(name: String): Any = name
object LoadStuff:
transparent inline def make = ${ makeImpl }
private def makeImpl(using Quotes): Expr[Any] =
import quotes.reflect.*
Class.forName("org.h2.Driver") // problematic line
val refinement = Refinement(TypeRepr.of[LoadStuff], "name", TypeRepr.of[String])
refinement.asType match
case '[refined] => '{ LoadStuff().asInstanceOf[refined] }
Output
Interactive compiler reports error diagnostics:
java.lang.ClassNotFoundException: java.sql.Driver
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:421)
at java.base/java.lang.Class.forName(Class.java:412)
at a.LoadStuff$.makeImpl(LoadStuff.scala:13)
at a.LoadStuff$.inline$makeImpl(LoadStuff.scala:10)
Expectation
Should compile fine and diagnostics should be empty.
ncreep commented
Hi,
Just adding some further info from the original issue.
Thinking about it, this can be further minimized, as this has nothing to do with Selectable
. Apparently just being a transparent
inline with class loading is enough to trigger this behavior:
object LoadStuff:
transparent inline def make: Unit = ${ makeImpl }
private def makeImpl(using Quotes): Expr[Unit] =
Class.forName("org.h2.Driver")
'{()}
This too triggers a loss of type-information at the call-site of make
.
Removing transparent
brings back type information.
Thanks