Skip to content

Commit

Permalink
Add marker interface LibraryClassLoader
Browse files Browse the repository at this point in the history
This mixes in a market interface with scalaVersion method into URLClassLoader.
We can use this later to distinguish new launcher vs old one.
  • Loading branch information
eed3si9n committed Mar 2, 2018
1 parent 2b07b4b commit 91f8a63
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ class Launch private[xsbt] (val bootDirectory: File, val lockBoot: Boolean, val

private object LoaderInit {
val (library, other) = module.fullClasspath.partition(_.getName.startsWith("scala-library"))
val libraryLoader = new URLClassLoader(toURLs(library), parentLoader)
val libraryLoader = new LibraryClassLoader(toURLs(library), parentLoader, scalaVersion)
val fullLoader = new URLClassLoader(toURLs(other), libraryLoader)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package xsbt.boot

import java.net.{ URL, URLClassLoader }

final class LibraryClassLoader(urls: Array[URL], parent: ClassLoader,
val scalaVersion: String) extends URLClassLoader(urls, parent) with xsbti.LibraryClassLoader {
}
20 changes: 16 additions & 4 deletions launcher-implementation/src/test/scala/ScalaProviderTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ object ScalaProviderTest extends Specification {
"provide ClassLoader for Scala 2.8.2" in { checkScalaLoader("2.8.2") }
"provide ClassLoader for Scala 2.9.0" in { checkScalaLoader("2.9.0") }
"provide ClassLoader for Scala 2.9.2" in { checkScalaLoader("2.9.2") }
"provide ClassLoader for Scala 2.10.4" in { checkScalaLoader("2.10.4") }
"provide ClassLoader for Scala 2.11.0" in { checkScalaLoader("2.11.0") }
"provide ClassLoader for Scala 2.10.7" in { checkScalaLoader("2.10.7") }
"provide ClassLoader for Scala 2.11.12" in { checkScalaLoader("2.11.12") }
// This requires the test to run in JDK 8
// "provide ClassLoader for Scala 2.12.4" in { checkScalaLoader("2.12.4") }
}

"Launch" should {
Expand Down Expand Up @@ -68,10 +70,20 @@ object ScalaProviderTest extends Specification {
val provider = launcher.getScala(version)
val loader = provider.loader
// ensure that this loader can load Scala classes by trying scala.ScalaObject.
tryScala(loader)
tryScala(loader, loader.getParent)
getScalaVersion(loader) must beEqualTo(versionValue)

val libraryLoader = provider.loader.getParent
// Test the structural type
libraryLoader match {
case x: ClassLoader with LibraryLoader => x.scalaVersion must be(version)
}
tryScala(libraryLoader, libraryLoader)
}
private def tryScala(loader: ClassLoader) = Class.forName("scala.Product", false, loader).getClassLoader must be(loader)
private def tryScala(loader: ClassLoader, libraryLoader: ClassLoader) =
Class.forName("scala.Product", false, loader).getClassLoader must be(libraryLoader)

type LibraryLoader = { def scalaVersion: String }
}
object LaunchTest {
def testApp(main: String): Application = testApp(main, Array[File]())
Expand Down
11 changes: 11 additions & 0 deletions launcher-interface/src/main/java/xsbti/LibraryClassLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package xsbti;

import java.io.File;

/**
* Marker interface for classloader with just scala-library.
*/
public interface LibraryClassLoader
{
public String scalaVersion();
}

0 comments on commit 91f8a63

Please sign in to comment.