From 4a946a68cde88a92f5aa1620170a5ab7ff5aa2e3 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Wed, 27 Mar 2024 10:37:44 +0100 Subject: [PATCH] Fix project1/extra --- .../java/sbt/internal/MetaBuildLoader.java | 60 +++++++++---------- sbt-app/src/sbt-test/project1/extra/build.sbt | 17 +++--- .../sbt-test/project1/extra/{pending => test} | 0 3 files changed, 36 insertions(+), 41 deletions(-) rename sbt-app/src/sbt-test/project1/extra/{pending => test} (100%) diff --git a/main/src/main/java/sbt/internal/MetaBuildLoader.java b/main/src/main/java/sbt/internal/MetaBuildLoader.java index 05cef0f02..f8ce8ceea 100644 --- a/main/src/main/java/sbt/internal/MetaBuildLoader.java +++ b/main/src/main/java/sbt/internal/MetaBuildLoader.java @@ -81,41 +81,27 @@ public final class MetaBuildLoader extends URLClassLoader { jnaJars); final Pattern pattern = Pattern.compile(fullPattern); final File[] cp = appProvider.mainClasspath(); - final URL[] interfaceURLs = new URL[3]; - final URL[] jlineURLs = new URL[7]; + final Set interfaceFiles = new LinkedHashSet<>(); + final Set jlineFiles = new LinkedHashSet<>(); final File[] extra = appProvider.id().classpathExtra() == null ? new File[0] : appProvider.id().classpathExtra(); final Set bottomClasspath = new LinkedHashSet<>(); - { - int interfaceIndex = 0; - int jlineIndex = 0; - for (final File file : cp) { - final String name = file.getName(); - if ((name.contains("test-interface") - || name.contains("compiler-interface") - || name.contains("util-interface")) - && pattern.matcher(name).find()) { - interfaceURLs[interfaceIndex] = file.toURI().toURL(); - interfaceIndex += 1; - } else if (pattern.matcher(name).find()) { - jlineURLs[jlineIndex] = file.toURI().toURL(); - jlineIndex += 1; - } else { - bottomClasspath.add(file); - } - } - for (final File file : extra) { + for (final File file : cp) { + final String name = file.getName(); + if ((name.contains("test-interface") + || name.contains("compiler-interface") + || name.contains("util-interface")) + && pattern.matcher(name).find()) { + interfaceFiles.add(file); + } else if (pattern.matcher(name).find()) { + jlineFiles.add(file); + } else { bottomClasspath.add(file); } } - final URL[] rest = new URL[bottomClasspath.size()]; - { - int i = 0; - for (final File file : bottomClasspath) { - rest[i] = file.toURI().toURL(); - i += 1; - } + for (final File file : extra) { + bottomClasspath.add(file); } final ScalaProvider scalaProvider = appProvider.scalaProvider(); ClassLoader topLoader = scalaProvider.launcher().topLoader(); @@ -148,8 +134,9 @@ public final class MetaBuildLoader extends URLClassLoader { } }; - final SbtInterfaceLoader interfaceLoader = new SbtInterfaceLoader(interfaceURLs, topLoader); - final JLineLoader jlineLoader = new JLineLoader(jlineURLs, interfaceLoader); + final SbtInterfaceLoader interfaceLoader = + new SbtInterfaceLoader(toURLArray(interfaceFiles), topLoader); + final JLineLoader jlineLoader = new JLineLoader(toURLArray(jlineFiles), interfaceLoader); final File[] siJars = scalaProvider.jars(); final URL[] lib = new URL[1]; int scalaRestCount = siJars.length - 1; @@ -175,6 +162,17 @@ public final class MetaBuildLoader extends URLClassLoader { assert lib[0] != null : "no scala-library.jar"; final ScalaLibraryClassLoader libraryLoader = new ScalaLibraryClassLoader(lib, jlineLoader); final FullScalaLoader fullScalaLoader = new FullScalaLoader(scalaRest, libraryLoader); - return new MetaBuildLoader(rest, fullScalaLoader, libraryLoader, interfaceLoader, jlineLoader); + return new MetaBuildLoader( + toURLArray(bottomClasspath), fullScalaLoader, libraryLoader, interfaceLoader, jlineLoader); + } + + private static URL[] toURLArray(Set files) throws java.net.MalformedURLException { + URL[] urls = new URL[files.size()]; + int i = 0; + for (final File file : files) { + urls[i] = file.toURI().toURL(); + i += 1; + } + return urls; } } diff --git a/sbt-app/src/sbt-test/project1/extra/build.sbt b/sbt-app/src/sbt-test/project1/extra/build.sbt index ecc1b85e9..6c6e89e57 100644 --- a/sbt-app/src/sbt-test/project1/extra/build.sbt +++ b/sbt-app/src/sbt-test/project1/extra/build.sbt @@ -24,22 +24,19 @@ def checkExtra = s } -def addExtra1(s: State, extra: Seq[File]): State = - { - val cs = s.configuration.provider.components() - val copied = cs.addToComponent("extra", extra.toArray) - if(copied) s.reload else s - } +def addExtra1(s: State, extra: Seq[File]): State = { + val cs = s.configuration.provider.components() + val copied = cs.addToComponent("extra", extra.toArray) + if(copied) s.reload else s +} def addExtra2(s: State, extra: Seq[File]): State = { val reload = State.defaultReload(s) val currentID = reload.app val currentExtra = currentID.classpathExtra val newExtra = (currentExtra ++ extra).distinct - if(newExtra.length == currentExtra.length) - s - else - { + if(newExtra.length == currentExtra.length) s + else { val newID = ApplicationID(currentID).copy(extra = extra) s.setNext(new State.Return(reload.copy(app = newID))) } diff --git a/sbt-app/src/sbt-test/project1/extra/pending b/sbt-app/src/sbt-test/project1/extra/test similarity index 100% rename from sbt-app/src/sbt-test/project1/extra/pending rename to sbt-app/src/sbt-test/project1/extra/test