Put compiler-interface in the Scala Instance top loader

This commit is contained in:
Adrien Piquerez 2020-12-10 18:41:40 +01:00
parent 5d1c394bb4
commit c9ab2ee558
3 changed files with 19 additions and 9 deletions

View File

@ -65,11 +65,17 @@ public final class MetaBuildLoader extends URLClassLoader {
*/
public static MetaBuildLoader makeLoader(final AppProvider appProvider) throws IOException {
final String jlineJars = "jline-?[0-9.]+-sbt-.*|jline-terminal(-(jna|jansi))?-[0-9.]+";
final String testInterfaceJars = "test-interface-[0-9.]+";
final String compilerInterfaceJars = "compiler-interface-[0-9.]+(-.*)?";
final String jansiJars = "jansi-[0-9.]+";
final String jnaJars = "jna-(platform-)?[0-9.]+";
final String fullPattern =
"^(test-interface-[0-9.]+|" + jlineJars + "|jansi-[0-9.]+|jna-(platform-)?[0-9.]+)\\.jar";
String.format(
"^(%s|%s|%s|%s|%s)\\.jar",
jlineJars, testInterfaceJars, compilerInterfaceJars, jansiJars, jnaJars);
final Pattern pattern = Pattern.compile(fullPattern);
final File[] cp = appProvider.mainClasspath();
final URL[] interfaceURLs = new URL[1];
final URL[] interfaceURLs = new URL[2];
final URL[] jlineURLs = new URL[7];
final File[] extra =
appProvider.id().classpathExtra() == null ? new File[0] : appProvider.id().classpathExtra();
@ -80,7 +86,8 @@ public final class MetaBuildLoader extends URLClassLoader {
int jlineIndex = 0;
for (final File file : cp) {
final String name = file.getName();
if (name.contains("test-interface") && pattern.matcher(name).find()) {
if ((name.contains("test-interface") || name.contains("compiler-interface"))
&& pattern.matcher(name).find()) {
interfaceURLs[interfaceIndex] = file.toURI().toURL();
interfaceIndex += 1;
} else if (pattern.matcher(name).find()) {
@ -133,7 +140,7 @@ public final class MetaBuildLoader extends URLClassLoader {
}
};
final TestInterfaceLoader interfaceLoader = new TestInterfaceLoader(interfaceURLs, topLoader);
final SbtInterfaceLoader interfaceLoader = new SbtInterfaceLoader(interfaceURLs, topLoader);
final JLineLoader jlineLoader = new JLineLoader(jlineURLs, interfaceLoader);
final File[] siJars = scalaProvider.jars();
final URL[] lib = new URL[1];

View File

@ -10,14 +10,15 @@ package sbt.internal;
import java.net.URL;
import java.net.URLClassLoader;
class TestInterfaceLoader extends URLClassLoader {
TestInterfaceLoader(final URL[] urls, final ClassLoader parent) {
// This ClassLoader must contain pure sbt java interfaces
class SbtInterfaceLoader extends URLClassLoader {
SbtInterfaceLoader(final URL[] urls, final ClassLoader parent) {
super(urls, parent);
}
@Override
public String toString() {
return "SbtTestInterfaceClassLoader(" + getURLs()[0] + ")";
return "SbtInterfaceClassLoader(" + getURLs()[0] + ")";
}
static {

View File

@ -332,8 +332,10 @@ object Defaults extends BuildCommon {
exportPipelining := usePipelining.value,
useScalaReplJLine :== false,
scalaInstanceTopLoader := {
if (!useScalaReplJLine.value) classOf[org.jline.terminal.Terminal].getClassLoader
else appConfiguration.value.provider.scalaProvider.launcher.topLoader.getParent
// the JLineLoader contains the SbtInterfaceClassLoader
if (!useScalaReplJLine.value)
classOf[org.jline.terminal.Terminal].getClassLoader // the JLineLoader
else classOf[Compilers].getClassLoader // the SbtInterfaceClassLoader
},
useSuperShell := { if (insideCI.value) false else ITerminal.console.isSupershellEnabled },
superShellThreshold :== SysProp.supershellThreshold,