From 5f94252ff8ee2f19ca37c63224a4cab400d2d8cc Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sun, 26 May 2019 19:47:55 -0700 Subject: [PATCH] Fix dotty plugin The dotty sbt-bridge module assumes that it's going to get a URLClassLoader from which it can extract all of the classpath urls. That doesn't work with the old wrapped classloader because its classpath was empty. As a nasty workaround, I override the getURLs method, which is where it gets the URLs from. After this change the compiler-project/dotty-compiler-plugin test passes. --- .../scala/sbt/internal/classpath/ClassLoaderCache.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala b/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala index 652cb185d..41a5ae7e9 100644 --- a/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala +++ b/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala @@ -3,7 +3,7 @@ package sbt.internal.classpath import java.io.File import java.lang.management.ManagementFactory import java.lang.ref.{ Reference, ReferenceQueue, SoftReference } -import java.net.URLClassLoader +import java.net.{ URL, URLClassLoader } import java.util.concurrent.atomic.AtomicInteger import sbt.internal.inc.classpath.{ @@ -107,7 +107,13 @@ private[sbt] class ClassLoaderCache( else ClassLoaderReference.apply private[this] val cleanupThread = new CleanupThread(ClassLoaderCache.threadID.getAndIncrement()) private[this] val lock = new Object + private class WrappedLoader(parent: ClassLoader) extends URLClassLoader(Array.empty, parent) { + // This is to make dotty work which extracts the URLs from the loader + override def getURLs: Array[URL] = parent match { + case u: URLClassLoader => u.getURLs + case _ => Array.empty + } override def toString: String = s"WrappedLoader($parent)" } private def close(classLoader: ClassLoader): Unit = classLoader match {