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 { public static MetaBuildLoader makeLoader(final AppProvider appProvider) throws IOException {
final String jlineJars = "jline-?[0-9.]+-sbt-.*|jline-terminal(-(jna|jansi))?-[0-9.]+"; 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 = 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 Pattern pattern = Pattern.compile(fullPattern);
final File[] cp = appProvider.mainClasspath(); final File[] cp = appProvider.mainClasspath();
final URL[] interfaceURLs = new URL[1]; final URL[] interfaceURLs = new URL[2];
final URL[] jlineURLs = new URL[7]; final URL[] jlineURLs = new URL[7];
final File[] extra = final File[] extra =
appProvider.id().classpathExtra() == null ? new File[0] : appProvider.id().classpathExtra(); appProvider.id().classpathExtra() == null ? new File[0] : appProvider.id().classpathExtra();
@ -80,7 +86,8 @@ public final class MetaBuildLoader extends URLClassLoader {
int jlineIndex = 0; int jlineIndex = 0;
for (final File file : cp) { for (final File file : cp) {
final String name = file.getName(); 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(); interfaceURLs[interfaceIndex] = file.toURI().toURL();
interfaceIndex += 1; interfaceIndex += 1;
} else if (pattern.matcher(name).find()) { } 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 JLineLoader jlineLoader = new JLineLoader(jlineURLs, interfaceLoader);
final File[] siJars = scalaProvider.jars(); final File[] siJars = scalaProvider.jars();
final URL[] lib = new URL[1]; final URL[] lib = new URL[1];

View File

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

View File

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