diff --git a/.github/workflows/stdlib.yaml b/.github/workflows/stdlib.yaml index 3bcac366f433..e4020882281d 100644 --- a/.github/workflows/stdlib.yaml +++ b/.github/workflows/stdlib.yaml @@ -280,6 +280,24 @@ jobs: - name: Compile `scala3-library` for Scala.js run: ./project/scripts/sbt scala3-library-sjs/compile + repl: + runs-on: ubuntu-latest + needs: [scala3-compiler-bootstrapped] + steps: + - name: Git Checkout + uses: actions/checkout@v5 + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: 17 + cache: 'sbt' + - uses: sbt/setup-sbt@v1 + + - name: Compile REPL + run: ./project/scripts/sbt scala3-repl/compile + scaladoc: runs-on: ubuntu-latest needs: [scala3-compiler-bootstrapped, scala3-tasty-inspector] @@ -548,6 +566,23 @@ jobs: run: ./project/scripts/sbt ";sjsJUnitTests/clean ;set sjsJUnitTests/scalaJSLinkerConfig ~= switchToLatestESVersion ;set Global/enableWebAssembly := true; sjsJUnitTests/test" # TODO Scala.js on Windows + test-repl: + runs-on: ubuntu-latest + needs: [repl] + steps: + - name: Git Checkout + uses: actions/checkout@v5 + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: 17 + cache: 'sbt' + - uses: sbt/setup-sbt@v1 + - name: Test REPL + run: ./project/scripts/sbt scala3-repl/test + scripted-tests: runs-on: ubuntu-latest needs: [scala3-compiler-bootstrapped, tasty-core-bootstrapped, scala3-staging, scala3-tasty-inspector, scala-library-sjs, scaladoc] diff --git a/build.sbt b/build.sbt index bde1cbe76cce..c6c9a8e3caa7 100644 --- a/build.sbt +++ b/build.sbt @@ -7,6 +7,7 @@ val `scala3-compiler` = Build.`scala3-compiler` val `scala3-compiler-nonbootstrapped` = Build.`scala3-compiler-nonbootstrapped` val `scala3-compiler-bootstrapped-new` = Build.`scala3-compiler-bootstrapped-new` val `scala3-compiler-bootstrapped` = Build.`scala3-compiler-bootstrapped` +val `scala3-repl` = Build.`scala3-repl` val `scala-library-sjs` = Build.`scala-library-sjs` val `scala3-library-sjs` = Build.`scala3-library-sjs` val `scala-library-nonbootstrapped` = Build.`scala-library-nonbootstrapped` diff --git a/compiler/src/dotty/tools/dotc/quoted/Interpreter.scala b/compiler/src/dotty/tools/dotc/quoted/Interpreter.scala index daab56b9fff3..04cb637b18ac 100644 --- a/compiler/src/dotty/tools/dotc/quoted/Interpreter.scala +++ b/compiler/src/dotty/tools/dotc/quoted/Interpreter.scala @@ -25,7 +25,7 @@ import dotty.tools.dotc.quoted.* import dotty.tools.dotc.typer.ImportInfo.withRootImports import dotty.tools.dotc.util.SrcPos import dotty.tools.dotc.reporting.Message -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader import dotty.tools.dotc.core.CyclicReference /** Tree interpreter for metaprogramming constructs */ @@ -35,7 +35,7 @@ class Interpreter(pos: SrcPos, classLoader0: ClassLoader)(using Context): val classLoader = if ctx.owner.topLevelClass.name.startsWith(str.REPL_SESSION_LINE) then - new AbstractFileClassLoader(ctx.settings.outputDir.value, classLoader0, "false") + new AbstractFileClassLoader(ctx.settings.outputDir.value, classLoader0) else classLoader0 /** Local variable environment */ @@ -204,11 +204,7 @@ class Interpreter(pos: SrcPos, classLoader0: ClassLoader)(using Context): } private def loadReplLineClass(moduleClass: Symbol): Class[?] = { - val lineClassloader = new AbstractFileClassLoader( - ctx.settings.outputDir.value, - classLoader, - "false" - ) + val lineClassloader = new AbstractFileClassLoader(ctx.settings.outputDir.value, classLoader) lineClassloader.loadClass(moduleClass.name.firstPart.toString) } diff --git a/compiler/src/dotty/tools/dotc/transform/Splicer.scala b/compiler/src/dotty/tools/dotc/transform/Splicer.scala index 9e60ece4cc67..a40db72d0ccb 100644 --- a/compiler/src/dotty/tools/dotc/transform/Splicer.scala +++ b/compiler/src/dotty/tools/dotc/transform/Splicer.scala @@ -22,7 +22,7 @@ import dotty.tools.dotc.quoted.Interpreter import scala.util.control.NonFatal import dotty.tools.dotc.util.SrcPos -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader import scala.reflect.ClassTag diff --git a/compiler/src/dotty/tools/dotc/util/ClasspathFromClassloader.scala b/compiler/src/dotty/tools/dotc/util/ClasspathFromClassloader.scala index 25def103083d..198499f2593e 100644 --- a/compiler/src/dotty/tools/dotc/util/ClasspathFromClassloader.scala +++ b/compiler/src/dotty/tools/dotc/util/ClasspathFromClassloader.scala @@ -5,7 +5,7 @@ import scala.language.unsafeNulls import java.net.URLClassLoader import java.nio.file.Paths -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader object ClasspathFromClassloader { diff --git a/compiler/src/dotty/tools/io/AbstractFileClassLoader.scala b/compiler/src/dotty/tools/io/AbstractFileClassLoader.scala new file mode 100644 index 000000000000..839905cf9bf6 --- /dev/null +++ b/compiler/src/dotty/tools/io/AbstractFileClassLoader.scala @@ -0,0 +1,61 @@ +/* + * Scala (https://www.scala-lang.org) + * + * Copyright EPFL and Lightbend, Inc. + * + * Licensed under Apache License 2.0 + * (http://www.apache.org/licenses/LICENSE-2.0). + * + * See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + */ + +package dotty.tools +package io + +import scala.language.unsafeNulls + +import dotty.tools.io.AbstractFile + +import java.net.{URL, URLConnection, URLStreamHandler} +import java.util.Collections + +class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader) extends ClassLoader(parent): + private def findAbstractFile(name: String) = root.lookupPath(name.split('/').toIndexedSeq, directory = false) + + // on JDK 20 the URL constructor we're using is deprecated, + // but the recommended replacement, URL.of, doesn't exist on JDK 8 + @annotation.nowarn("cat=deprecation") + override protected def findResource(name: String): URL | Null = + findAbstractFile(name) match + case null => null + case file => new URL(null, s"memory:${file.path}", new URLStreamHandler { + override def openConnection(url: URL): URLConnection = new URLConnection(url) { + override def connect() = () + override def getInputStream = file.input + } + }) + override protected def findResources(name: String): java.util.Enumeration[URL] = + findResource(name) match + case null => Collections.enumeration(Collections.emptyList[URL]) //Collections.emptyEnumeration[URL] + case url => Collections.enumeration(Collections.singleton(url)) + + override def findClass(name: String): Class[?] = { + var file: AbstractFile | Null = root + val pathParts = name.split("[./]").toList + for (dirPart <- pathParts.init) { + file = file.lookupName(dirPart, true) + if (file == null) { + throw new ClassNotFoundException(name) + } + } + file = file.lookupName(pathParts.last+".class", false) + if (file == null) { + throw new ClassNotFoundException(name) + } + val bytes = file.toByteArray + defineClass(name, bytes, 0, bytes.length) + } + + override def loadClass(name: String): Class[?] = try findClass(name) catch case _: ClassNotFoundException => super.loadClass(name) +end AbstractFileClassLoader diff --git a/compiler/src/dotty/tools/repl/package.scala b/compiler/src/dotty/tools/repl/package.scala deleted file mode 100644 index b780d877e57a..000000000000 --- a/compiler/src/dotty/tools/repl/package.scala +++ /dev/null @@ -1,10 +0,0 @@ -package dotty.tools - -import dotc.reporting.{HideNonSensicalMessages, StoreReporter, UniqueMessagePositions} - -package object repl { - /** Create empty outer store reporter */ - private[repl] def newStoreReporter: StoreReporter = - new StoreReporter(null) - with UniqueMessagePositions with HideNonSensicalMessages -} diff --git a/compiler/test-resources/repl/jar-command b/compiler/test-resources/repl/jar-command deleted file mode 100644 index b0ded22d3654..000000000000 --- a/compiler/test-resources/repl/jar-command +++ /dev/null @@ -1,13 +0,0 @@ -scala> val z = 1 -val z: Int = 1 - -scala>:jar sbt-test/source-dependencies/canon/actual/a.jar -Added 'sbt-test/source-dependencies/canon/actual/a.jar' to classpath. - -scala> import A.x - -scala> x -val res0: Int = 3 - -scala> z -val res1: Int = 1 diff --git a/compiler/test-resources/repl/jar-errors b/compiler/test-resources/repl/jar-errors deleted file mode 100644 index 7d5720fcb233..000000000000 --- a/compiler/test-resources/repl/jar-errors +++ /dev/null @@ -1,11 +0,0 @@ -scala>:jar path/does/not/exist -Cannot add "path/does/not/exist" to classpath. - -scala>:jar sbt-test/source-dependencies/canon/actual/a.jar -Added 'sbt-test/source-dependencies/canon/actual/a.jar' to classpath. - -scala>:jar sbt-test/source-dependencies/canon/actual/a.jar -The path 'sbt-test/source-dependencies/canon/actual/a.jar' cannot be loaded, it contains a classfile that already exists on the classpath: sbt-test/source-dependencies/canon/actual/a.jar(A.class) - -scala>:require sbt-test/source-dependencies/canon/actual/a.jar -:require is no longer supported, but has been replaced with :jar. Please use :jar \ No newline at end of file diff --git a/compiler/test/dotty/Properties.scala b/compiler/test/dotty/Properties.scala index 9b2dc22faba1..6b529704b832 100644 --- a/compiler/test/dotty/Properties.scala +++ b/compiler/test/dotty/Properties.scala @@ -60,6 +60,9 @@ object Properties { /** dotty-compiler jar */ def dottyCompiler: String = sys.props("dotty.tests.classes.dottyCompiler") + /** dotty-repl jar */ + def dottyRepl: String = sys.props("dotty.tests.classes.dottyRepl") + /** dotty-staging jar */ def dottyStaging: String = sys.props("dotty.tests.classes.dottyStaging") diff --git a/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala b/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala index 0b0fb1e172af..400b2dbc46aa 100644 --- a/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala +++ b/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala @@ -156,22 +156,17 @@ class BootstrappedOnlyCompilationTests { @Test def picklingWithCompiler: Unit = { implicit val testGroup: TestGroup = TestGroup("testPicklingWithCompiler") - // Exclude this file from the test as it contains some changes that require scala 2.13.17 - // This filter can be dropped once we drop the dependency to Scala 2 (in 3.8.0) - val rlibscala3 = FileFilter.exclude(List("ScalaRunTime.scala")) - aggregateTests( compileDir("compiler/src/dotty/tools", picklingWithCompilerOptions, recursive = false), compileDir("compiler/src/dotty/tools/dotc", picklingWithCompilerOptions, recursive = false), compileDir("library/src/scala/runtime/function", picklingWithCompilerOptions), - compileFilesInDir("library/src/scala/runtime", picklingWithCompilerOptions, rlibscala3), + compileFilesInDir("library/src/scala/runtime", picklingWithCompilerOptions), compileFilesInDir("compiler/src/dotty/tools/backend/jvm", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/ast", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/core", picklingWithCompilerOptions, recursive = false), compileDir("compiler/src/dotty/tools/dotc/config", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/parsing", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/printing", picklingWithCompilerOptions), - compileDir("compiler/src/dotty/tools/repl", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/rewrites", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/transform", picklingWithCompilerOptions), compileDir("compiler/src/dotty/tools/dotc/typer", picklingWithCompilerOptions), diff --git a/compiler/test/dotty/tools/repl/ScriptedTests.scala b/compiler/test/dotty/tools/repl/ScriptedTests.scala deleted file mode 100644 index dc809228e86b..000000000000 --- a/compiler/test/dotty/tools/repl/ScriptedTests.scala +++ /dev/null @@ -1,20 +0,0 @@ -package dotty -package tools -package repl - -import org.junit.Test -import org.junit.experimental.categories.Category - -/** Runs all tests contained in `compiler/test-resources/repl/` */ -class ScriptedTests extends ReplTest { - - @Test def replTests = scripts("/repl").foreach(testFile) - - @Category(Array(classOf[BootstrappedOnlyTests])) - @Test def replMacrosTests = scripts("/repl-macros").foreach(testFile) - - @Test def typePrinterTests = scripts("/type-printer").foreach(testFile) -} - -object ScriptedTests { -} diff --git a/compiler/test/dotty/tools/vulpix/TestConfiguration.scala b/compiler/test/dotty/tools/vulpix/TestConfiguration.scala index 587221c8f632..b61368de97eb 100644 --- a/compiler/test/dotty/tools/vulpix/TestConfiguration.scala +++ b/compiler/test/dotty/tools/vulpix/TestConfiguration.scala @@ -34,8 +34,6 @@ object TestConfiguration { val withCompilerClasspath = mkClasspath(List( Properties.scalaLibrary, Properties.scalaAsm, - Properties.jlineTerminal, - Properties.jlineReader, Properties.compilerInterface, Properties.dottyInterfaces, Properties.tastyCore, @@ -54,6 +52,16 @@ object TestConfiguration { Properties.scalaJSLibrary, )) + lazy val replClassPath = + withCompilerClasspath + File.pathSeparator + mkClasspath(List( + Properties.dottyRepl, + Properties.jlineTerminal, + Properties.jlineReader, + )) + + lazy val replWithStagingClasspath = + replClassPath + File.pathSeparator + mkClasspath(List(Properties.dottyStaging)) + def mkClasspath(classpaths: List[String]): String = classpaths.map({ p => val file = new java.io.File(p) @@ -71,6 +79,8 @@ object TestConfiguration { val unindentOptions = TestFlags(basicClasspath, Array("-no-indent") ++ checkOptions ++ noCheckOptions ++ yCheckOptions) val withCompilerOptions = defaultOptions.withClasspath(withCompilerClasspath).withRunClasspath(withCompilerClasspath) + lazy val withReplOptions = + defaultOptions.withRunClasspath(replClassPath) lazy val withStagingOptions = defaultOptions.withClasspath(withStagingClasspath).withRunClasspath(withStagingClasspath) lazy val withTastyInspectorOptions = diff --git a/project/Build.scala b/project/Build.scala index 94d50578388f..7fb2c1b306a2 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -724,14 +724,9 @@ object Build { libraryDependencies ++= Seq( "org.scala-lang.modules" % "scala-asm" % "9.8.0-scala-1", // used by the backend Dependencies.compilerInterface, - "org.jline" % "jline-reader" % "3.29.0", // used by the REPL - "org.jline" % "jline-terminal" % "3.29.0", - "org.jline" % "jline-terminal-jni" % "3.29.0", // needed for Windows ("io.get-coursier" %% "coursier" % "2.0.16" % Test).cross(CrossVersion.for3Use2_13), ), - (Compile / sourceGenerators) += ShadedSourceGenerator.task.taskValue, - // For convenience, change the baseDirectory when running the compiler Compile / forkOptions := (Compile / forkOptions).value.withWorkingDirectory((ThisBuild / baseDirectory).value), Compile / run / forkOptions := (Compile / run / forkOptions).value.withWorkingDirectory((ThisBuild / baseDirectory).value), @@ -773,8 +768,6 @@ object Build { "-Ddotty.tests.classes.compilerInterface=" + findArtifactPath(externalDeps, "compiler-interface"), "-Ddotty.tests.classes.scalaLibrary=" + findArtifactPath(externalDeps, "scala-library"), "-Ddotty.tests.classes.scalaAsm=" + findArtifactPath(externalDeps, "scala-asm"), - "-Ddotty.tests.classes.jlineTerminal=" + findArtifactPath(externalDeps, "jline-terminal"), - "-Ddotty.tests.classes.jlineReader=" + findArtifactPath(externalDeps, "jline-reader"), ) }, @@ -1479,7 +1472,8 @@ object Build { .enablePlugins(ScriptedPlugin) .aggregate(`scala3-interfaces`, `scala3-library-bootstrapped-new` , `scala-library-bootstrapped`, `tasty-core-bootstrapped-new`, `scala3-compiler-bootstrapped-new`, `scala3-sbt-bridge-bootstrapped`, - `scala3-staging-new`, `scala3-tasty-inspector-new`, `scala-library-sjs`, `scala3-library-sjs`, `scaladoc-new`) + `scala3-staging-new`, `scala3-tasty-inspector-new`, `scala-library-sjs`, `scala3-library-sjs`, + `scaladoc-new`, `scala3-repl`) .settings( name := "scala3-bootstrapped", moduleName := "scala3-bootstrapped", @@ -1588,13 +1582,14 @@ object Build { (`scala3-staging-new` / publishLocalBin), (`scala3-tasty-inspector-new` / publishLocalBin), (`scaladoc-new` / publishLocalBin), + (`scala3-repl` / publishLocalBin), publishLocalBin, ).evaluated, ) /* Configuration of the org.scala-lang:scala3-sbt-bridge:*.**.**-bootstrapped project */ lazy val `scala3-sbt-bridge-bootstrapped` = project.in(file("sbt-bridge")) - .dependsOn(`scala3-compiler-bootstrapped-new`) // TODO: Would this actually evict the reference compiler in scala-tool? + .dependsOn(`scala3-compiler-bootstrapped-new`, `scala3-repl`) // TODO: Would this actually evict the reference compiler in scala-tool? .settings(publishSettings) .settings( name := "scala3-sbt-bridge-bootstrapped", @@ -1607,6 +1602,7 @@ object Build { // Add the source directories for the sbt-bridge (boostrapped) Compile / unmanagedSourceDirectories := Seq(baseDirectory.value / "src"), Test / unmanagedSourceDirectories := Seq(baseDirectory.value / "test"), + Compile / unmanagedSourceDirectories += baseDirectory.value / "src-bootstrapped", Compile / resourceDirectory := baseDirectory.value / "resources", // NOTE: The only difference here is that we drop `-Werror` and semanticDB for now Compile / scalacOptions := Seq("-deprecation", "-feature", "-unchecked", "-encoding", "UTF8", "-language:implicitConversions"), @@ -1773,6 +1769,97 @@ object Build { }, ) + lazy val `scala3-repl` = project.in(file("repl")) + .dependsOn(`scala3-compiler-bootstrapped-new` % "compile->compile;test->test") + .settings(publishSettings) + .settings( + name := "scala3-repl", + moduleName := "scala3-repl", + version := dottyVersion, + versionScheme := Some("semver-spec"), + scalaVersion := referenceVersion, + crossPaths := true, + autoScalaLibrary := false, + // Add the source directories for the sbt-bridge (boostrapped) + Compile / unmanagedSourceDirectories := Seq(baseDirectory.value / "src"), + Compile / unmanagedResourceDirectories := Seq(baseDirectory.value / "resources"), + Test / unmanagedSourceDirectories := Seq(baseDirectory.value / "test"), + Test / unmanagedResourceDirectories := Seq(baseDirectory.value / "test-resources"), + // NOTE: The only difference here is that we drop `-Werror` and semanticDB for now + Compile / scalacOptions := Seq("-deprecation", "-feature", "-unchecked", "-encoding", "UTF8", "-language:implicitConversions"), + // Make sure that the produced artifacts have the minimum JVM version in the bytecode + Compile / javacOptions ++= Seq("--release", Versions.minimumJVMVersion), + Compile / scalacOptions ++= Seq("--java-output-version", Versions.minimumJVMVersion), + // Packaging configuration of `scala3-staging` + Compile / packageBin / publishArtifact := true, + Compile / packageDoc / publishArtifact := false, + Compile / packageSrc / publishArtifact := true, + // Only publish compilation artifacts, no test artifacts + Test / publishArtifact := false, + publish / skip := false, + libraryDependencies ++= Seq( + "org.jline" % "jline-reader" % "3.29.0", + "org.jline" % "jline-terminal" % "3.29.0", + "org.jline" % "jline-terminal-jni" % "3.29.0", + "com.lihaoyi" %% "pprint" % "0.9.3", + "com.lihaoyi" %% "fansi" % "0.5.1", + "com.lihaoyi" %% "sourcecode" % "0.4.4", + "com.github.sbt" % "junit-interface" % "0.13.3" % Test, + ), + // Configure to use the non-bootstrapped compiler + scalaInstance := { + val externalCompilerDeps = (`scala3-compiler-nonbootstrapped` / Compile / externalDependencyClasspath).value.map(_.data).toSet + + // IMPORTANT: We need to use actual jars to form the ScalaInstance and not + // just directories containing classfiles because sbt maintains a cache of + // compiler instances. This cache is invalidated based on timestamps + // however this is only implemented on jars, directories are never + // invalidated. + val tastyCore = (`tasty-core-nonbootstrapped` / Compile / packageBin).value + val scalaLibrary = (`scala-library-nonbootstrapped` / Compile / packageBin).value + val scala3Interfaces = (`scala3-interfaces` / Compile / packageBin).value + val scala3Compiler = (`scala3-compiler-nonbootstrapped` / Compile / packageBin).value + + Defaults.makeScalaInstance( + dottyNonBootstrappedVersion, + libraryJars = Array(scalaLibrary), + allCompilerJars = Seq(tastyCore, scala3Interfaces, scala3Compiler) ++ externalCompilerDeps, + allDocJars = Seq.empty, + state.value, + scalaInstanceTopLoader.value + ) + }, + scalaCompilerBridgeBinaryJar := { + Some((`scala3-sbt-bridge-nonbootstrapped` / Compile / packageBin).value) + }, + Test / javaOptions ++= { + val log = streams.value.log + val managedSrcDir = { + // Populate the directory + (Compile / managedSources).value + + (Compile / sourceManaged).value + } + val externalDeps = (ThisProject / Runtime / externalDependencyClasspath).value + Seq( + s"-Ddotty.tests.dottyCompilerManagedSources=${managedSrcDir}", + s"-Ddotty.tests.classes.dottyInterfaces=${(`scala3-interfaces` / Compile / packageBin).value}", + s"-Ddotty.tests.classes.dottyCompiler=${(`scala3-compiler-bootstrapped-new` / Compile / packageBin).value}", + s"-Ddotty.tests.classes.dottyRepl=${(ThisProject / Compile / packageBin).value}", + s"-Ddotty.tests.classes.tastyCore=${(`tasty-core-bootstrapped-new` / Compile / packageBin).value}", + s"-Ddotty.tests.classes.compilerInterface=${findArtifactPath(externalDeps, "compiler-interface")}", + s"-Ddotty.tests.classes.scalaLibrary=${(`scala-library-bootstrapped` / Compile / packageBin).value}", + s"-Ddotty.tests.classes.scalaJSScalalib=${(`scala-library-sjs` / Compile / packageBin).value}", + s"-Ddotty.tests.classes.scalaAsm=${findArtifactPath(externalDeps, "scala-asm")}", + s"-Ddotty.tests.classes.jlineTerminal=${findArtifactPath(externalDeps, "jline-terminal")}", + s"-Ddotty.tests.classes.jlineReader=${findArtifactPath(externalDeps, "jline-reader")}", + s"-Ddotty.tests.classes.dottyStaging=${(LocalProject("scala3-staging-new") / Compile / packageBin).value}", + s"-Ddotty.tests.classes.dottyTastyInspector=${(LocalProject("scala3-tasty-inspector-new") / Compile / packageBin).value}", + s"-Ddotty.tools.dotc.semanticdb.test=${(ThisBuild / baseDirectory).value/"tests"/"semanticdb"}", + ) + }, + ) + // ============================================================================================== // =================================== SCALA STANDARD LIBRARY =================================== // ============================================================================================== @@ -2333,9 +2420,6 @@ object Build { "com.github.sbt" % "junit-interface" % "0.13.3" % Test, "org.scala-lang.modules" % "scala-asm" % "9.8.0-scala-1", Dependencies.compilerInterface, - "org.jline" % "jline-reader" % "3.29.0", - "org.jline" % "jline-terminal" % "3.29.0", - "org.jline" % "jline-terminal-jni" % "3.29.0", ("io.get-coursier" %% "coursier" % "2.0.16" % Test).cross(CrossVersion.for3Use2_13), ), // NOTE: The only difference here is that we drop `-Werror` and semanticDB for now @@ -2379,7 +2463,6 @@ object Build { Seq(file) }.taskValue, - (Compile / sourceGenerators) += ShadedSourceGenerator.task.taskValue, // sbt adds all the projects to scala-tool config which breaks building the scalaInstance // as a workaround, I build it manually by only adding the compiler managedScalaInstance := false, @@ -2475,8 +2558,6 @@ object Build { s"-Ddotty.tests.classes.compilerInterface=${findArtifactPath(externalDeps, "compiler-interface")}", s"-Ddotty.tests.classes.scalaLibrary=${(`scala-library-nonbootstrapped` / Compile / packageBin).value}", s"-Ddotty.tests.classes.scalaAsm=${findArtifactPath(externalDeps, "scala-asm")}", - s"-Ddotty.tests.classes.jlineTerminal=${findArtifactPath(externalDeps, "jline-terminal")}", - s"-Ddotty.tests.classes.jlineReader=${findArtifactPath(externalDeps, "jline-reader")}", s"-Ddotty.tools.dotc.semanticdb.test=${(ThisBuild / baseDirectory).value/"tests"/"semanticdb"}", ) }, @@ -2506,9 +2587,6 @@ object Build { libraryDependencies ++= Seq( "org.scala-lang.modules" % "scala-asm" % "9.8.0-scala-1", Dependencies.compilerInterface, - "org.jline" % "jline-reader" % "3.29.0", - "org.jline" % "jline-terminal" % "3.29.0", - "org.jline" % "jline-terminal-jni" % "3.29.0", "com.github.sbt" % "junit-interface" % "0.13.3" % Test, ("io.get-coursier" %% "coursier" % "2.0.16" % Test).cross(CrossVersion.for3Use2_13), ), @@ -2621,7 +2699,6 @@ object Build { sjsSources } (Set(scalaJSIRSourcesJar)).toSeq }.taskValue, - (Compile / sourceGenerators) += ShadedSourceGenerator.task.taskValue, Compile / run / forkOptions := (Compile / run / forkOptions).value .withWorkingDirectory((ThisBuild / baseDirectory).value), // Configuration of the test suite @@ -2650,8 +2727,6 @@ object Build { s"-Ddotty.tests.classes.scalaLibrary=${(`scala-library-bootstrapped` / Compile / packageBin).value}", s"-Ddotty.tests.classes.scalaJSScalalib=${(`scala-library-sjs` / Compile / packageBin).value}", s"-Ddotty.tests.classes.scalaAsm=${findArtifactPath(externalDeps, "scala-asm")}", - s"-Ddotty.tests.classes.jlineTerminal=${findArtifactPath(externalDeps, "jline-terminal")}", - s"-Ddotty.tests.classes.jlineReader=${findArtifactPath(externalDeps, "jline-reader")}", s"-Ddotty.tests.classes.dottyStaging=${(LocalProject("scala3-staging-new") / Compile / packageBin).value}", s"-Ddotty.tests.classes.dottyTastyInspector=${(LocalProject("scala3-tasty-inspector-new") / Compile / packageBin).value}", s"-Ddotty.tools.dotc.semanticdb.test=${(ThisBuild / baseDirectory).value/"tests"/"semanticdb"}", @@ -2937,7 +3012,7 @@ object Build { .settings(commonBootstrappedSettings) lazy val `scala3-language-server` = project.in(file("language-server")). - dependsOn(dottyCompiler(Bootstrapped)). + dependsOn(dottyCompiler(Bootstrapped), `scala3-repl`). settings(commonBootstrappedSettings). settings( libraryDependencies ++= Seq( @@ -3273,8 +3348,6 @@ object Build { s"-Ddotty.tests.classes.compilerInterface=${findArtifactPath(externalDeps, "compiler-interface")}", s"-Ddotty.tests.classes.scalaLibrary=${(`scala-library-nonbootstrapped` / Compile / packageBin).value}", s"-Ddotty.tests.classes.scalaAsm=${findArtifactPath(externalDeps, "scala-asm")}", - s"-Ddotty.tests.classes.jlineTerminal=${findArtifactPath(externalDeps, "jline-terminal")}", - s"-Ddotty.tests.classes.jlineReader=${findArtifactPath(externalDeps, "jline-reader")}", s"-Ddotty.tools.dotc.semanticdb.test=${(ThisBuild / baseDirectory).value/"tests"/"semanticdb"}", "-Ddotty.tests.classes.scalaJSScalalib=" + (`scala-library-sjs` / Compile / packageBin).value, "-Ddotty.tests.classes.scalaJSJavalib=" + findArtifactPath(externalJSDeps, "scalajs-javalib"), diff --git a/project/ShadedSourceGenerator.scala b/project/ShadedSourceGenerator.scala deleted file mode 100644 index e3a1c9680db9..000000000000 --- a/project/ShadedSourceGenerator.scala +++ /dev/null @@ -1,110 +0,0 @@ -import sbt._ -import sbt.Keys._ - -/** - * ShadedSourceGenerator - A build plugin for creating shaded versions of external dependencies - * - * This generator downloads source JARs for specified dependencies (currently pprint, fansi, and sourcecode), - * extracts them, and applies patches to: - * 1. Add the dotty.shaded package prefix - * 2. Rewrite imports to use _root_ to avoid conflicts - * 3. Apply Scala 3 compatibility fixes (mostly due to enforcing null safety in scala/scala3) - * - * The shaded sources are placed in the managed source directory and included in compilation. - * This allows the Scala 3 compiler to bundle these utilities without external dependencies. - */ -object ShadedSourceGenerator { - - val task = Def.task { - val s = streams.value - val cacheDir = s.cacheDirectory - val dest = (Compile / sourceManaged).value / "downloaded" - val lm = dependencyResolution.value - - val dependencies = Seq( - ("com.lihaoyi", "pprint_3", "0.9.3"), - ("com.lihaoyi", "fansi_3", "0.5.1"), - ("com.lihaoyi", "sourcecode_3", "0.4.4"), - ) - - // Create a marker file that tracks the dependencies for cache invalidation - val markerFile = cacheDir / "shaded-sources-marker" - val markerContent = dependencies.map { case (org, name, version) => s"$org:$name:$version:sources" }.mkString("\n") - if (!markerFile.exists || IO.read(markerFile) != markerContent) { - IO.write(markerFile, markerContent) - } - - FileFunction.cached(cacheDir / "fetchShadedSources", - FilesInfo.lastModified, FilesInfo.exists) { _ => - s.log.info(s"Downloading and processing shaded sources to $dest...") - - if (dest.exists) { - IO.delete(dest) - } - IO.createDirectory(dest) - - for((org, name, version) <- dependencies) { - import sbt.librarymanagement._ - - val moduleId = ModuleID(org, name, version).sources() - val retrieveDir = cacheDir / "retrieved" / s"$org-$name-$version-sources" - - s.log.info(s"Retrieving $org:$name:$version:sources...") - val retrieved = lm.retrieve(moduleId, scalaModuleInfo = None, retrieveDir, s.log) - val jarFiles = retrieved.fold( - w => throw w.resolveException, - files => files.filter(_.getName.contains("-sources.jar")) - ) - - jarFiles.foreach { jarFile => - s.log.info(s"Extracting ${jarFile.getName}...") - IO.unzip(jarFile, dest) - } - } - - val scalaFiles = (dest ** "*.scala").get - - // Define patches as a map from search text to replacement text - val patches = Map( - "import scala" -> "import _root_.scala", - " scala.collection." -> " _root_.scala.collection.", - "def apply(c: Char): Trie[T]" -> "def apply(c: Char): Trie[T] | Null", - "var head: Iterator[T] = null" -> "var head: Iterator[T] | Null = null", - "if (head != null && head.hasNext) true" -> "if (head != null && head.nn.hasNext) true", - "head.next()" -> "head.nn.next()", - "abstract class Walker" -> "@scala.annotation.nowarn abstract class Walker", - "object TPrintLowPri" -> "@scala.annotation.nowarn object TPrintLowPri", - "x.toString match{" -> "scala.runtime.ScalaRunTime.stringOf(x) match{" - ) - - val patchUsageCounter = scala.collection.mutable.Map(patches.keys.map(_ -> 0).toSeq: _*) - - scalaFiles.foreach { file => - val text = IO.read(file) - if (!file.getName.equals("CollectionName.scala")) { - var processedText = "package dotty.shaded\n" + text - - // Apply patches and count usage - patches.foreach { case (search, replacement) => - if (processedText.contains(search)) { - processedText = processedText.replace(search, replacement) - patchUsageCounter(search) += 1 - } - } - - IO.write(file, processedText) - } - } - - // Assert that all patches were applied at least once - val unappliedPatches = patchUsageCounter.filter(_._2 == 0).keys - if (unappliedPatches.nonEmpty) { - throw new RuntimeException(s"Patches were not applied: ${unappliedPatches.mkString(", ")}") - } - - scalaFiles.toSet - } (Set(markerFile)).toSeq - - } - -} \ No newline at end of file diff --git a/project/scripts/bootstrappedOnlyCmdTests b/project/scripts/bootstrappedOnlyCmdTests index 6f5c75ceb922..b264ec1105b1 100755 --- a/project/scripts/bootstrappedOnlyCmdTests +++ b/project/scripts/bootstrappedOnlyCmdTests @@ -109,11 +109,11 @@ echo "testing ./bin/scala with arguments" test "$EXPECTED_OUTPUT_ARGS" = "$(cat "$tmp")" clear_cli_dotfiles project/scripts -echo "testing i12973" -clear_out "$OUT" -./bin/scalac -d "$OUT/out.jar" tests/pos/i12973.scala -echo "Bug12973().check" | TERM=dumb ./bin/scala -cp "$OUT/out.jar" > "$tmp" 2>&1 -grep -qe "Bug12973 is fixed" "$tmp" +#echo "testing i12973" +#clear_out "$OUT" +#./bin/scalac -d "$OUT/out.jar" tests/pos/i12973.scala +#echo "Bug12973().check" | TERM=dumb ./bin/scala -cp "$OUT/out.jar" > "$tmp" 2>&1 +#grep -qe "Bug12973 is fixed" "$tmp" echo "testing -sourcepath with incremental compile: inlining changed inline def into a def" # Here we will test that a changed inline method symbol loaded from the sourcepath (-sourcepath compiler option) diff --git a/repl/resources/META-INF/services/javax.script.ScriptEngineFactory b/repl/resources/META-INF/services/javax.script.ScriptEngineFactory new file mode 100644 index 000000000000..2a0ca4d4298d --- /dev/null +++ b/repl/resources/META-INF/services/javax.script.ScriptEngineFactory @@ -0,0 +1 @@ +dotty.tools.repl.ScriptEngine$Factory diff --git a/compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala b/repl/src/dotty/tools/repl/AbstractFileClassLoader.scala similarity index 98% rename from compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala rename to repl/src/dotty/tools/repl/AbstractFileClassLoader.scala index c46f12e1ed6d..c23a6bcd0268 100644 --- a/compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala +++ b/repl/src/dotty/tools/repl/AbstractFileClassLoader.scala @@ -16,7 +16,6 @@ package repl import scala.language.unsafeNulls import io.AbstractFile -import dotty.tools.repl.ReplBytecodeInstrumentation import java.net.{URL, URLConnection, URLStreamHandler} import java.util.Collections diff --git a/compiler/src/dotty/tools/repl/CollectTopLevelImports.scala b/repl/src/dotty/tools/repl/CollectTopLevelImports.scala similarity index 83% rename from compiler/src/dotty/tools/repl/CollectTopLevelImports.scala rename to repl/src/dotty/tools/repl/CollectTopLevelImports.scala index 860c4a9372f9..011c7f18b996 100644 --- a/compiler/src/dotty/tools/repl/CollectTopLevelImports.scala +++ b/repl/src/dotty/tools/repl/CollectTopLevelImports.scala @@ -1,8 +1,9 @@ -package dotty.tools.repl +package dotty.tools +package repl -import dotty.tools.dotc.ast.tpd -import dotty.tools.dotc.core.Contexts.* -import dotty.tools.dotc.core.Phases.Phase +import dotc.ast.tpd +import dotc.core.Contexts.* +import dotc.core.Phases.Phase import scala.compiletime.uninitialized diff --git a/compiler/src/dotty/tools/repl/JLineTerminal.scala b/repl/src/dotty/tools/repl/JLineTerminal.scala similarity index 96% rename from compiler/src/dotty/tools/repl/JLineTerminal.scala rename to repl/src/dotty/tools/repl/JLineTerminal.scala index fc193667154d..89c3aae665fb 100644 --- a/compiler/src/dotty/tools/repl/JLineTerminal.scala +++ b/repl/src/dotty/tools/repl/JLineTerminal.scala @@ -1,13 +1,14 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls -import dotty.tools.dotc.core.Contexts.* -import dotty.tools.dotc.parsing.Scanners.Scanner -import dotty.tools.dotc.parsing.Tokens.* -import dotty.tools.dotc.printing.SyntaxHighlighting -import dotty.tools.dotc.reporting.Reporter -import dotty.tools.dotc.util.SourceFile +import dotc.core.Contexts.* +import dotc.parsing.Scanners.Scanner +import dotc.parsing.Tokens.* +import dotc.printing.SyntaxHighlighting +import dotc.reporting.Reporter +import dotc.util.SourceFile import org.jline.reader import org.jline.reader.Parser.ParseContext import org.jline.reader.* diff --git a/compiler/src/dotty/tools/repl/Main.scala b/repl/src/dotty/tools/repl/Main.scala similarity index 85% rename from compiler/src/dotty/tools/repl/Main.scala rename to repl/src/dotty/tools/repl/Main.scala index f4d6b505d430..14f894e64924 100644 --- a/compiler/src/dotty/tools/repl/Main.scala +++ b/repl/src/dotty/tools/repl/Main.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl /** Main entry point to the REPL */ // To test, run bin/scala diff --git a/compiler/src/dotty/tools/repl/ParseResult.scala b/repl/src/dotty/tools/repl/ParseResult.scala similarity index 100% rename from compiler/src/dotty/tools/repl/ParseResult.scala rename to repl/src/dotty/tools/repl/ParseResult.scala diff --git a/compiler/src/dotty/tools/repl/Rendering.scala b/repl/src/dotty/tools/repl/Rendering.scala similarity index 86% rename from compiler/src/dotty/tools/repl/Rendering.scala rename to repl/src/dotty/tools/repl/Rendering.scala index a86ba12bb0a9..3f62654fafae 100644 --- a/compiler/src/dotty/tools/repl/Rendering.scala +++ b/repl/src/dotty/tools/repl/Rendering.scala @@ -27,32 +27,9 @@ private[repl] class Rendering(parentClassLoader: Option[ClassLoader] = None): var myClassLoader: AbstractFileClassLoader = uninitialized private def pprintRender(value: Any, width: Int, height: Int, initialOffset: Int)(using Context): String = { - def fallback() = - dotty.shaded.pprint.PPrinter.BlackWhite - .apply(value, width = width, height = height, initialOffset = initialOffset) - .plainText - try - val cl = classLoader() - val pprintCls = Class.forName("dotty.shaded.pprint.PPrinter$BlackWhite$", false, cl) - val fansiStrCls = Class.forName("dotty.shaded.fansi.Str", false, cl) - val BlackWhite = pprintCls.getField("MODULE$").get(null) - val BlackWhite_apply = pprintCls.getMethod("apply", - classOf[Any], // value - classOf[Int], // width - classOf[Int], // height - classOf[Int], // indentation - classOf[Int], // initialOffset - classOf[Boolean], // escape Unicode - classOf[Boolean], // show field names - ) - val FansiStr_plainText = fansiStrCls.getMethod("plainText") - val fansiStr = BlackWhite_apply.invoke( - BlackWhite, value, width, height, 2, initialOffset, false, true - ) - FansiStr_plainText.invoke(fansiStr).asInstanceOf[String] - catch - case _: ClassNotFoundException => fallback() - case _: NoSuchMethodException => fallback() + pprint.PPrinter.BlackWhite + .apply(value, width = width, height = height, initialOffset = initialOffset) + .plainText } diff --git a/compiler/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala b/repl/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala similarity index 94% rename from compiler/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala rename to repl/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala index e0eae1310e11..57ff5b02a0a5 100644 --- a/compiler/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala +++ b/repl/src/dotty/tools/repl/ReplBytecodeInstrumentation.scala @@ -24,7 +24,7 @@ object ReplBytecodeInstrumentation: def setStopFlag(classLoader: ClassLoader, b: Boolean): Unit = val cancelClassOpt = - try Some(classLoader.loadClass(classOf[dotty.tools.repl.StopRepl].getName)) + try Some(classLoader.loadClass(classOf[StopRepl].getName)) catch { case _: java.lang.ClassNotFoundException => None } @@ -51,7 +51,7 @@ object ReplBytecodeInstrumentation: def addStopCheck() = mv.visitMethodInsn( INVOKESTATIC, - classOf[dotty.tools.repl.StopRepl].getName.replace('.', '/'), + classOf[StopRepl].getName.replace('.', '/'), "throwIfReplStopped", "()V", false diff --git a/compiler/src/dotty/tools/repl/ReplCommand.scala b/repl/src/dotty/tools/repl/ReplCommand.scala similarity index 68% rename from compiler/src/dotty/tools/repl/ReplCommand.scala rename to repl/src/dotty/tools/repl/ReplCommand.scala index 0b40a7cec0b3..1e6f6c091e92 100644 --- a/compiler/src/dotty/tools/repl/ReplCommand.scala +++ b/repl/src/dotty/tools/repl/ReplCommand.scala @@ -1,7 +1,8 @@ -package dotty.tools.repl +package dotty.tools +package repl -import dotty.tools.dotc.config.Properties.* -import dotty.tools.dotc.config.CompilerCommand +import dotc.config.Properties.* +import dotc.config.CompilerCommand object ReplCommand extends CompilerCommand: override def cmdName: String = "scala" diff --git a/compiler/src/dotty/tools/repl/ReplCompiler.scala b/repl/src/dotty/tools/repl/ReplCompiler.scala similarity index 92% rename from compiler/src/dotty/tools/repl/ReplCompiler.scala rename to repl/src/dotty/tools/repl/ReplCompiler.scala index 89b2491d9af8..f600113df35c 100644 --- a/compiler/src/dotty/tools/repl/ReplCompiler.scala +++ b/repl/src/dotty/tools/repl/ReplCompiler.scala @@ -1,25 +1,27 @@ -package dotty.tools.repl - -import dotty.tools.dotc.ast.Trees.* -import dotty.tools.dotc.ast.{tpd, untpd} -import dotty.tools.dotc.ast.tpd.TreeOps -import dotty.tools.dotc.core.Contexts.* -import dotty.tools.dotc.core.CompilationUnitInfo -import dotty.tools.dotc.core.Decorators.* -import dotty.tools.dotc.core.Flags.* -import dotty.tools.dotc.core.Names.* -import dotty.tools.dotc.core.Phases.Phase -import dotty.tools.dotc.core.StdNames.* -import dotty.tools.dotc.core.Symbols.* -import dotty.tools.dotc.reporting.Diagnostic -import dotty.tools.dotc.transform.{CheckUnused, CheckShadowing, PostTyper, UnrollDefinitions} -import dotty.tools.dotc.typer.ImportInfo.{withRootImports, RootRef} -import dotty.tools.dotc.typer.TyperPhase -import dotty.tools.dotc.util.Spans.* -import dotty.tools.dotc.util.{ParsedComment, Property, SourceFile} -import dotty.tools.dotc.{CompilationUnit, Compiler, Run} -import dotty.tools.repl.results.* -import dotty.tools.dotc.util.chaining.* +package dotty.tools +package repl + +import dotc.ast.Trees.* +import dotc.ast.{tpd, untpd} +import dotc.ast.tpd.TreeOps +import dotc.core.Contexts.* +import dotc.core.CompilationUnitInfo +import dotc.core.Decorators.* +import dotc.core.Flags.* +import dotc.core.Names.* +import dotc.core.Phases.Phase +import dotc.core.StdNames.* +import dotc.core.Symbols.* +import dotc.reporting.Diagnostic +import dotc.transform.{CheckUnused, CheckShadowing, PostTyper, UnrollDefinitions} +import dotc.typer.ImportInfo.{withRootImports, RootRef} +import dotc.typer.TyperPhase +import dotc.util.Spans.* +import dotc.util.{ParsedComment, Property, SourceFile} +import dotc.{CompilationUnit, Compiler, Run} +import dotc.util.chaining.* + +import results.* import scala.collection.mutable diff --git a/compiler/src/dotty/tools/repl/ReplDriver.scala b/repl/src/dotty/tools/repl/ReplDriver.scala similarity index 94% rename from compiler/src/dotty/tools/repl/ReplDriver.scala rename to repl/src/dotty/tools/repl/ReplDriver.scala index 5cd8fd0bf539..1dd5e5ea90b2 100644 --- a/compiler/src/dotty/tools/repl/ReplDriver.scala +++ b/repl/src/dotty/tools/repl/ReplDriver.scala @@ -1,43 +1,45 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls import java.io.{File => JFile, PrintStream} import java.nio.charset.StandardCharsets -import dotty.tools.dotc.ast.Trees.* -import dotty.tools.dotc.ast.{tpd, untpd} -import dotty.tools.dotc.classpath.ClassPathFactory -import dotty.tools.dotc.config.CommandLineParser.tokenize -import dotty.tools.dotc.config.Properties.{javaVersion, javaVmName, simpleVersionString} -import dotty.tools.dotc.core.Contexts.* -import dotty.tools.dotc.core.Decorators.* -import dotty.tools.dotc.core.Phases.{unfusedPhases, typerPhase} -import dotty.tools.dotc.core.Denotations.Denotation -import dotty.tools.dotc.core.Flags.* -import dotty.tools.dotc.core.Mode -import dotty.tools.dotc.core.NameKinds.SimpleNameKind -import dotty.tools.dotc.core.NameKinds.DefaultGetterName -import dotty.tools.dotc.core.NameOps.* -import dotty.tools.dotc.core.Names.Name -import dotty.tools.dotc.core.StdNames.* -import dotty.tools.dotc.core.Symbols.{Symbol, defn} -import dotty.tools.dotc.core.SymbolLoaders -import dotty.tools.dotc.interfaces -import dotty.tools.dotc.interactive.Completion -import dotty.tools.dotc.printing.SyntaxHighlighting -import dotty.tools.dotc.reporting.{ConsoleReporter, StoreReporter} -import dotty.tools.dotc.reporting.Diagnostic -import dotty.tools.dotc.util.Spans.Span -import dotty.tools.dotc.util.{SourceFile, SourcePosition} -import dotty.tools.dotc.{CompilationUnit, Driver} -import dotty.tools.dotc.config.CompilerCommand -import dotty.tools.io.* -import dotty.tools.repl.Rendering.showUser -import dotty.tools.repl.ReplBytecodeInstrumentation +import dotc.ast.Trees.* +import dotc.ast.{tpd, untpd} +import dotc.classpath.ClassPathFactory +import dotc.config.CommandLineParser.tokenize +import dotc.config.Properties.{javaVersion, javaVmName, simpleVersionString} +import dotc.core.Contexts.* +import dotc.core.Decorators.* +import dotc.core.Phases.{unfusedPhases, typerPhase} +import dotc.core.Denotations.Denotation +import dotc.core.Flags.* +import dotc.core.Mode +import dotc.core.NameKinds.SimpleNameKind +import dotc.core.NameKinds.DefaultGetterName +import dotc.core.NameOps.* +import dotc.core.Names.Name +import dotc.core.StdNames.* +import dotc.core.Symbols.{Symbol, defn} +import dotc.core.SymbolLoaders +import dotc.interfaces +import dotc.interactive.Completion +import dotc.printing.SyntaxHighlighting +import dotc.reporting.{ConsoleReporter, StoreReporter} +import dotc.reporting.Diagnostic +import dotc.util.Spans.Span +import dotc.util.{SourceFile, SourcePosition} +import dotc.{CompilationUnit, Driver} +import dotc.config.CompilerCommand +import dotty.tools.io.{AbstractFileClassLoader => _, *} import dotty.tools.runner.ScalaClassLoader.* + import org.jline.reader.* +import Rendering.showUser + import scala.annotation.tailrec import scala.collection.mutable import scala.compiletime.uninitialized @@ -680,4 +682,4 @@ class ReplDriver(settings: Array[String], end ReplDriver object ReplDriver: - def pprintImport = "import dotty.shaded.pprint.pprintln\n" \ No newline at end of file + def pprintImport = "import pprint.pprintln\n" \ No newline at end of file diff --git a/compiler/src/dotty/tools/repl/ScriptEngine.scala b/repl/src/dotty/tools/repl/ScriptEngine.scala similarity index 100% rename from compiler/src/dotty/tools/repl/ScriptEngine.scala rename to repl/src/dotty/tools/repl/ScriptEngine.scala diff --git a/compiler/src/dotty/tools/repl/StopRepl.scala b/repl/src/dotty/tools/repl/StopRepl.scala similarity index 93% rename from compiler/src/dotty/tools/repl/StopRepl.scala rename to repl/src/dotty/tools/repl/StopRepl.scala index 17e7078a3774..85c9dc3e23a2 100644 --- a/compiler/src/dotty/tools/repl/StopRepl.scala +++ b/repl/src/dotty/tools/repl/StopRepl.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.annotation.static diff --git a/repl/src/dotty/tools/repl/package.scala b/repl/src/dotty/tools/repl/package.scala new file mode 100644 index 000000000000..c7ded08b0982 --- /dev/null +++ b/repl/src/dotty/tools/repl/package.scala @@ -0,0 +1,9 @@ +package dotty.tools +package repl + +import dotc.reporting.{HideNonSensicalMessages, StoreReporter, UniqueMessagePositions} + +/** Create empty outer store reporter */ +private[repl] def newStoreReporter: StoreReporter = + new StoreReporter(null) + with UniqueMessagePositions with HideNonSensicalMessages diff --git a/compiler/src/dotty/tools/repl/results.scala b/repl/src/dotty/tools/repl/results.scala similarity index 100% rename from compiler/src/dotty/tools/repl/results.scala rename to repl/src/dotty/tools/repl/results.scala diff --git a/tests/run-with-compiler/scripting.check b/repl/test-resources/jsr223/scripting.check similarity index 100% rename from tests/run-with-compiler/scripting.check rename to repl/test-resources/jsr223/scripting.check diff --git a/tests/run-with-compiler/scripting.scala b/repl/test-resources/jsr223/scripting.scala similarity index 100% rename from tests/run-with-compiler/scripting.scala rename to repl/test-resources/jsr223/scripting.scala diff --git a/compiler/test-resources/pending/repl/i2554 b/repl/test-resources/pending/repl/i2554 similarity index 100% rename from compiler/test-resources/pending/repl/i2554 rename to repl/test-resources/pending/repl/i2554 diff --git a/compiler/test-resources/pending/repl/i4539 b/repl/test-resources/pending/repl/i4539 similarity index 100% rename from compiler/test-resources/pending/repl/i4539 rename to repl/test-resources/pending/repl/i4539 diff --git a/compiler/test-resources/repl-macros/i15104a b/repl/test-resources/repl-macros/i15104a similarity index 100% rename from compiler/test-resources/repl-macros/i15104a rename to repl/test-resources/repl-macros/i15104a diff --git a/compiler/test-resources/repl-macros/i15104b b/repl/test-resources/repl-macros/i15104b similarity index 100% rename from compiler/test-resources/repl-macros/i15104b rename to repl/test-resources/repl-macros/i15104b diff --git a/compiler/test-resources/repl-macros/i15104c b/repl/test-resources/repl-macros/i15104c similarity index 100% rename from compiler/test-resources/repl-macros/i15104c rename to repl/test-resources/repl-macros/i15104c diff --git a/compiler/test-resources/repl-macros/i5551 b/repl/test-resources/repl-macros/i5551 similarity index 100% rename from compiler/test-resources/repl-macros/i5551 rename to repl/test-resources/repl-macros/i5551 diff --git a/compiler/test-resources/repl/10693 b/repl/test-resources/repl/10693 similarity index 100% rename from compiler/test-resources/repl/10693 rename to repl/test-resources/repl/10693 diff --git a/compiler/test-resources/repl/10886 b/repl/test-resources/repl/10886 similarity index 100% rename from compiler/test-resources/repl/10886 rename to repl/test-resources/repl/10886 diff --git a/compiler/test-resources/repl/1379 b/repl/test-resources/repl/1379 similarity index 100% rename from compiler/test-resources/repl/1379 rename to repl/test-resources/repl/1379 diff --git a/compiler/test-resources/repl/19184 b/repl/test-resources/repl/19184 similarity index 100% rename from compiler/test-resources/repl/19184 rename to repl/test-resources/repl/19184 diff --git a/compiler/test-resources/repl/3932 b/repl/test-resources/repl/3932 similarity index 100% rename from compiler/test-resources/repl/3932 rename to repl/test-resources/repl/3932 diff --git a/compiler/test-resources/repl/7472 b/repl/test-resources/repl/7472 similarity index 100% rename from compiler/test-resources/repl/7472 rename to repl/test-resources/repl/7472 diff --git a/compiler/test-resources/repl/commandPrefixes b/repl/test-resources/repl/commandPrefixes similarity index 100% rename from compiler/test-resources/repl/commandPrefixes rename to repl/test-resources/repl/commandPrefixes diff --git a/compiler/test-resources/repl/defaultClassloader b/repl/test-resources/repl/defaultClassloader similarity index 100% rename from compiler/test-resources/repl/defaultClassloader rename to repl/test-resources/repl/defaultClassloader diff --git a/compiler/test-resources/repl/defs b/repl/test-resources/repl/defs similarity index 100% rename from compiler/test-resources/repl/defs rename to repl/test-resources/repl/defs diff --git a/compiler/test-resources/repl/erased b/repl/test-resources/repl/erased similarity index 100% rename from compiler/test-resources/repl/erased rename to repl/test-resources/repl/erased diff --git a/compiler/test-resources/repl/erased-implicit b/repl/test-resources/repl/erased-implicit similarity index 100% rename from compiler/test-resources/repl/erased-implicit rename to repl/test-resources/repl/erased-implicit diff --git a/compiler/test-resources/repl/errmsgs b/repl/test-resources/repl/errmsgs similarity index 100% rename from compiler/test-resources/repl/errmsgs rename to repl/test-resources/repl/errmsgs diff --git a/compiler/test-resources/repl/functions b/repl/test-resources/repl/functions similarity index 100% rename from compiler/test-resources/repl/functions rename to repl/test-resources/repl/functions diff --git a/compiler/test-resources/repl/getClass b/repl/test-resources/repl/getClass similarity index 100% rename from compiler/test-resources/repl/getClass rename to repl/test-resources/repl/getClass diff --git a/compiler/test-resources/repl/i10044 b/repl/test-resources/repl/i10044 similarity index 100% rename from compiler/test-resources/repl/i10044 rename to repl/test-resources/repl/i10044 diff --git a/compiler/test-resources/repl/i10355 b/repl/test-resources/repl/i10355 similarity index 100% rename from compiler/test-resources/repl/i10355 rename to repl/test-resources/repl/i10355 diff --git a/compiler/test-resources/repl/i11146 b/repl/test-resources/repl/i11146 similarity index 100% rename from compiler/test-resources/repl/i11146 rename to repl/test-resources/repl/i11146 diff --git a/compiler/test-resources/repl/i13181 b/repl/test-resources/repl/i13181 similarity index 100% rename from compiler/test-resources/repl/i13181 rename to repl/test-resources/repl/i13181 diff --git a/compiler/test-resources/repl/i13208.default.scala b/repl/test-resources/repl/i13208.default.scala similarity index 100% rename from compiler/test-resources/repl/i13208.default.scala rename to repl/test-resources/repl/i13208.default.scala diff --git a/compiler/test-resources/repl/i13208.scala b/repl/test-resources/repl/i13208.scala similarity index 100% rename from compiler/test-resources/repl/i13208.scala rename to repl/test-resources/repl/i13208.scala diff --git a/compiler/test-resources/repl/i1369 b/repl/test-resources/repl/i1369 similarity index 100% rename from compiler/test-resources/repl/i1369 rename to repl/test-resources/repl/i1369 diff --git a/compiler/test-resources/repl/i1370 b/repl/test-resources/repl/i1370 similarity index 100% rename from compiler/test-resources/repl/i1370 rename to repl/test-resources/repl/i1370 diff --git a/compiler/test-resources/repl/i1374 b/repl/test-resources/repl/i1374 similarity index 100% rename from compiler/test-resources/repl/i1374 rename to repl/test-resources/repl/i1374 diff --git a/compiler/test-resources/repl/i1433 b/repl/test-resources/repl/i1433 similarity index 100% rename from compiler/test-resources/repl/i1433 rename to repl/test-resources/repl/i1433 diff --git a/compiler/test-resources/repl/i14540 b/repl/test-resources/repl/i14540 similarity index 100% rename from compiler/test-resources/repl/i14540 rename to repl/test-resources/repl/i14540 diff --git a/compiler/test-resources/repl/i15493 b/repl/test-resources/repl/i15493 similarity index 100% rename from compiler/test-resources/repl/i15493 rename to repl/test-resources/repl/i15493 diff --git a/compiler/test-resources/repl/i17231 b/repl/test-resources/repl/i17231 similarity index 100% rename from compiler/test-resources/repl/i17231 rename to repl/test-resources/repl/i17231 diff --git a/compiler/test-resources/repl/i18383 b/repl/test-resources/repl/i18383 similarity index 100% rename from compiler/test-resources/repl/i18383 rename to repl/test-resources/repl/i18383 diff --git a/compiler/test-resources/repl/i1854 b/repl/test-resources/repl/i1854 similarity index 100% rename from compiler/test-resources/repl/i1854 rename to repl/test-resources/repl/i1854 diff --git a/compiler/test-resources/repl/i18756 b/repl/test-resources/repl/i18756 similarity index 100% rename from compiler/test-resources/repl/i18756 rename to repl/test-resources/repl/i18756 diff --git a/compiler/test-resources/repl/i2063 b/repl/test-resources/repl/i2063 similarity index 100% rename from compiler/test-resources/repl/i2063 rename to repl/test-resources/repl/i2063 diff --git a/compiler/test-resources/repl/i21655 b/repl/test-resources/repl/i21655 similarity index 100% rename from compiler/test-resources/repl/i21655 rename to repl/test-resources/repl/i21655 diff --git a/compiler/test-resources/repl/i21657 b/repl/test-resources/repl/i21657 similarity index 100% rename from compiler/test-resources/repl/i21657 rename to repl/test-resources/repl/i21657 diff --git a/compiler/test-resources/repl/i2213 b/repl/test-resources/repl/i2213 similarity index 100% rename from compiler/test-resources/repl/i2213 rename to repl/test-resources/repl/i2213 diff --git a/compiler/test-resources/repl/i2310 b/repl/test-resources/repl/i2310 similarity index 100% rename from compiler/test-resources/repl/i2310 rename to repl/test-resources/repl/i2310 diff --git a/compiler/test-resources/repl/i2462 b/repl/test-resources/repl/i2462 similarity index 100% rename from compiler/test-resources/repl/i2462 rename to repl/test-resources/repl/i2462 diff --git a/compiler/test-resources/repl/i2631 b/repl/test-resources/repl/i2631 similarity index 100% rename from compiler/test-resources/repl/i2631 rename to repl/test-resources/repl/i2631 diff --git a/compiler/test-resources/repl/i2977 b/repl/test-resources/repl/i2977 similarity index 100% rename from compiler/test-resources/repl/i2977 rename to repl/test-resources/repl/i2977 diff --git a/compiler/test-resources/repl/i3388 b/repl/test-resources/repl/i3388 similarity index 100% rename from compiler/test-resources/repl/i3388 rename to repl/test-resources/repl/i3388 diff --git a/compiler/test-resources/repl/i3536 b/repl/test-resources/repl/i3536 similarity index 100% rename from compiler/test-resources/repl/i3536 rename to repl/test-resources/repl/i3536 diff --git a/compiler/test-resources/repl/i3536_bind b/repl/test-resources/repl/i3536_bind similarity index 100% rename from compiler/test-resources/repl/i3536_bind rename to repl/test-resources/repl/i3536_bind diff --git a/compiler/test-resources/repl/i3536_defdef b/repl/test-resources/repl/i3536_defdef similarity index 100% rename from compiler/test-resources/repl/i3536_defdef rename to repl/test-resources/repl/i3536_defdef diff --git a/compiler/test-resources/repl/i3536_object b/repl/test-resources/repl/i3536_object similarity index 100% rename from compiler/test-resources/repl/i3536_object rename to repl/test-resources/repl/i3536_object diff --git a/compiler/test-resources/repl/i3536_patterndef_some b/repl/test-resources/repl/i3536_patterndef_some similarity index 100% rename from compiler/test-resources/repl/i3536_patterndef_some rename to repl/test-resources/repl/i3536_patterndef_some diff --git a/compiler/test-resources/repl/i3536_patterndef_tuple b/repl/test-resources/repl/i3536_patterndef_tuple similarity index 100% rename from compiler/test-resources/repl/i3536_patterndef_tuple rename to repl/test-resources/repl/i3536_patterndef_tuple diff --git a/compiler/test-resources/repl/i3536_typedef b/repl/test-resources/repl/i3536_typedef similarity index 100% rename from compiler/test-resources/repl/i3536_typedef rename to repl/test-resources/repl/i3536_typedef diff --git a/compiler/test-resources/repl/i3536_var b/repl/test-resources/repl/i3536_var similarity index 100% rename from compiler/test-resources/repl/i3536_var rename to repl/test-resources/repl/i3536_var diff --git a/compiler/test-resources/repl/i3966 b/repl/test-resources/repl/i3966 similarity index 100% rename from compiler/test-resources/repl/i3966 rename to repl/test-resources/repl/i3966 diff --git a/compiler/test-resources/repl/i4010 b/repl/test-resources/repl/i4010 similarity index 100% rename from compiler/test-resources/repl/i4010 rename to repl/test-resources/repl/i4010 diff --git a/compiler/test-resources/repl/i4184 b/repl/test-resources/repl/i4184 similarity index 100% rename from compiler/test-resources/repl/i4184 rename to repl/test-resources/repl/i4184 diff --git a/compiler/test-resources/repl/i4217 b/repl/test-resources/repl/i4217 similarity index 100% rename from compiler/test-resources/repl/i4217 rename to repl/test-resources/repl/i4217 diff --git a/compiler/test-resources/repl/i4301 b/repl/test-resources/repl/i4301 similarity index 100% rename from compiler/test-resources/repl/i4301 rename to repl/test-resources/repl/i4301 diff --git a/compiler/test-resources/repl/i4566 b/repl/test-resources/repl/i4566 similarity index 100% rename from compiler/test-resources/repl/i4566 rename to repl/test-resources/repl/i4566 diff --git a/compiler/test-resources/repl/i4852 b/repl/test-resources/repl/i4852 similarity index 100% rename from compiler/test-resources/repl/i4852 rename to repl/test-resources/repl/i4852 diff --git a/compiler/test-resources/repl/i5218 b/repl/test-resources/repl/i5218 similarity index 100% rename from compiler/test-resources/repl/i5218 rename to repl/test-resources/repl/i5218 diff --git a/compiler/test-resources/repl/i5345 b/repl/test-resources/repl/i5345 similarity index 100% rename from compiler/test-resources/repl/i5345 rename to repl/test-resources/repl/i5345 diff --git a/compiler/test-resources/repl/i5350 b/repl/test-resources/repl/i5350 similarity index 100% rename from compiler/test-resources/repl/i5350 rename to repl/test-resources/repl/i5350 diff --git a/compiler/test-resources/repl/i5733 b/repl/test-resources/repl/i5733 similarity index 100% rename from compiler/test-resources/repl/i5733 rename to repl/test-resources/repl/i5733 diff --git a/compiler/test-resources/repl/i5890 b/repl/test-resources/repl/i5890 similarity index 100% rename from compiler/test-resources/repl/i5890 rename to repl/test-resources/repl/i5890 diff --git a/compiler/test-resources/repl/i6474 b/repl/test-resources/repl/i6474 similarity index 100% rename from compiler/test-resources/repl/i6474 rename to repl/test-resources/repl/i6474 diff --git a/compiler/test-resources/repl/i6643 b/repl/test-resources/repl/i6643 similarity index 100% rename from compiler/test-resources/repl/i6643 rename to repl/test-resources/repl/i6643 diff --git a/compiler/test-resources/repl/i6676 b/repl/test-resources/repl/i6676 similarity index 100% rename from compiler/test-resources/repl/i6676 rename to repl/test-resources/repl/i6676 diff --git a/compiler/test-resources/repl/i6986 b/repl/test-resources/repl/i6986 similarity index 100% rename from compiler/test-resources/repl/i6986 rename to repl/test-resources/repl/i6986 diff --git a/compiler/test-resources/repl/i7410 b/repl/test-resources/repl/i7410 similarity index 100% rename from compiler/test-resources/repl/i7410 rename to repl/test-resources/repl/i7410 diff --git a/compiler/test-resources/repl/i7644 b/repl/test-resources/repl/i7644 similarity index 100% rename from compiler/test-resources/repl/i7644 rename to repl/test-resources/repl/i7644 diff --git a/compiler/test-resources/repl/i8548 b/repl/test-resources/repl/i8548 similarity index 100% rename from compiler/test-resources/repl/i8548 rename to repl/test-resources/repl/i8548 diff --git a/compiler/test-resources/repl/i9102 b/repl/test-resources/repl/i9102 similarity index 100% rename from compiler/test-resources/repl/i9102 rename to repl/test-resources/repl/i9102 diff --git a/compiler/test-resources/repl/i9227 b/repl/test-resources/repl/i9227 similarity index 100% rename from compiler/test-resources/repl/i9227 rename to repl/test-resources/repl/i9227 diff --git a/compiler/test-resources/repl/i9538 b/repl/test-resources/repl/i9538 similarity index 100% rename from compiler/test-resources/repl/i9538 rename to repl/test-resources/repl/i9538 diff --git a/compiler/test-resources/repl/import b/repl/test-resources/repl/import similarity index 100% rename from compiler/test-resources/repl/import rename to repl/test-resources/repl/import diff --git a/compiler/test-resources/repl/import-shadowing b/repl/test-resources/repl/import-shadowing similarity index 100% rename from compiler/test-resources/repl/import-shadowing rename to repl/test-resources/repl/import-shadowing diff --git a/compiler/test-resources/repl/importFromObj b/repl/test-resources/repl/importFromObj similarity index 100% rename from compiler/test-resources/repl/importFromObj rename to repl/test-resources/repl/importFromObj diff --git a/compiler/test-resources/repl/init-script-flag b/repl/test-resources/repl/init-script-flag similarity index 100% rename from compiler/test-resources/repl/init-script-flag rename to repl/test-resources/repl/init-script-flag diff --git a/compiler/test-resources/repl/innerClasses b/repl/test-resources/repl/innerClasses similarity index 100% rename from compiler/test-resources/repl/innerClasses rename to repl/test-resources/repl/innerClasses diff --git a/repl/test-resources/repl/jar-command b/repl/test-resources/repl/jar-command new file mode 100644 index 000000000000..25b1e72b71df --- /dev/null +++ b/repl/test-resources/repl/jar-command @@ -0,0 +1,13 @@ +scala> val z = 1 +val z: Int = 1 + +scala>:jar ../sbt-test/source-dependencies/canon/actual/a.jar +Added '../sbt-test/source-dependencies/canon/actual/a.jar' to classpath. + +scala> import A.x + +scala> x +val res0: Int = 3 + +scala> z +val res1: Int = 1 diff --git a/repl/test-resources/repl/jar-errors b/repl/test-resources/repl/jar-errors new file mode 100644 index 000000000000..ff6284fc60ce --- /dev/null +++ b/repl/test-resources/repl/jar-errors @@ -0,0 +1,11 @@ +scala>:jar path/does/not/exist +Cannot add "path/does/not/exist" to classpath. + +scala>:jar ../sbt-test/source-dependencies/canon/actual/a.jar +Added '../sbt-test/source-dependencies/canon/actual/a.jar' to classpath. + +scala>:jar ../sbt-test/source-dependencies/canon/actual/a.jar +The path '../sbt-test/source-dependencies/canon/actual/a.jar' cannot be loaded, it contains a classfile that already exists on the classpath: ../sbt-test/source-dependencies/canon/actual/a.jar(A.class) + +scala>:require ../sbt-test/source-dependencies/canon/actual/a.jar +:require is no longer supported, but has been replaced with :jar. Please use :jar \ No newline at end of file diff --git a/compiler/test-resources/repl/jar-multiple b/repl/test-resources/repl/jar-multiple similarity index 65% rename from compiler/test-resources/repl/jar-multiple rename to repl/test-resources/repl/jar-multiple index cc2a7ec6dfbb..17e3aa255f72 100644 --- a/compiler/test-resources/repl/jar-multiple +++ b/repl/test-resources/repl/jar-multiple @@ -1,16 +1,16 @@ scala> val z = 1 val z: Int = 1 -scala>:jar compiler/test-resources/jars/mylibrary.jar -Added 'compiler/test-resources/jars/mylibrary.jar' to classpath. +scala>:jar ../compiler/test-resources/jars/mylibrary.jar +Added '../compiler/test-resources/jars/mylibrary.jar' to classpath. scala> import mylibrary.Utils scala> Utils.greet("Alice") val res0: String = "Hello, Alice!" -scala>:jar compiler/test-resources/jars/mylibrary2.jar -Added 'compiler/test-resources/jars/mylibrary2.jar' to classpath. +scala>:jar ../compiler/test-resources/jars/mylibrary2.jar +Added '../compiler/test-resources/jars/mylibrary2.jar' to classpath. scala> import mylibrary2.Utils2 diff --git a/compiler/test-resources/repl/notFound b/repl/test-resources/repl/notFound similarity index 100% rename from compiler/test-resources/repl/notFound rename to repl/test-resources/repl/notFound diff --git a/compiler/test-resources/repl/nowarn.scala b/repl/test-resources/repl/nowarn.scala similarity index 100% rename from compiler/test-resources/repl/nowarn.scala rename to repl/test-resources/repl/nowarn.scala diff --git a/compiler/test-resources/repl/onePlusOne b/repl/test-resources/repl/onePlusOne similarity index 100% rename from compiler/test-resources/repl/onePlusOne rename to repl/test-resources/repl/onePlusOne diff --git a/compiler/test-resources/repl/outputStream b/repl/test-resources/repl/outputStream similarity index 100% rename from compiler/test-resources/repl/outputStream rename to repl/test-resources/repl/outputStream diff --git a/compiler/test-resources/repl/overrides b/repl/test-resources/repl/overrides similarity index 100% rename from compiler/test-resources/repl/overrides rename to repl/test-resources/repl/overrides diff --git a/compiler/test-resources/repl/parsing b/repl/test-resources/repl/parsing similarity index 100% rename from compiler/test-resources/repl/parsing rename to repl/test-resources/repl/parsing diff --git a/compiler/test-resources/repl/patdef b/repl/test-resources/repl/patdef similarity index 100% rename from compiler/test-resources/repl/patdef rename to repl/test-resources/repl/patdef diff --git a/compiler/test-resources/repl/renderArray b/repl/test-resources/repl/renderArray similarity index 100% rename from compiler/test-resources/repl/renderArray rename to repl/test-resources/repl/renderArray diff --git a/compiler/test-resources/repl/renderEmptyString b/repl/test-resources/repl/renderEmptyString similarity index 100% rename from compiler/test-resources/repl/renderEmptyString rename to repl/test-resources/repl/renderEmptyString diff --git a/compiler/test-resources/repl/renderNothing b/repl/test-resources/repl/renderNothing similarity index 100% rename from compiler/test-resources/repl/renderNothing rename to repl/test-resources/repl/renderNothing diff --git a/compiler/test-resources/repl/renderNull b/repl/test-resources/repl/renderNull similarity index 100% rename from compiler/test-resources/repl/renderNull rename to repl/test-resources/repl/renderNull diff --git a/compiler/test-resources/repl/reset-command b/repl/test-resources/repl/reset-command similarity index 100% rename from compiler/test-resources/repl/reset-command rename to repl/test-resources/repl/reset-command diff --git a/compiler/test-resources/repl/rewrite-messages b/repl/test-resources/repl/rewrite-messages similarity index 100% rename from compiler/test-resources/repl/rewrite-messages rename to repl/test-resources/repl/rewrite-messages diff --git a/compiler/test-resources/repl/settings-command b/repl/test-resources/repl/settings-command similarity index 100% rename from compiler/test-resources/repl/settings-command rename to repl/test-resources/repl/settings-command diff --git a/compiler/test-resources/repl/settings-outputDir b/repl/test-resources/repl/settings-outputDir similarity index 100% rename from compiler/test-resources/repl/settings-outputDir rename to repl/test-resources/repl/settings-outputDir diff --git a/compiler/test-resources/repl/settings-repl-disable-display b/repl/test-resources/repl/settings-repl-disable-display similarity index 100% rename from compiler/test-resources/repl/settings-repl-disable-display rename to repl/test-resources/repl/settings-repl-disable-display diff --git a/compiler/test-resources/repl/settings-repl-max-print-both-truncation-settings b/repl/test-resources/repl/settings-repl-max-print-both-truncation-settings similarity index 100% rename from compiler/test-resources/repl/settings-repl-max-print-both-truncation-settings rename to repl/test-resources/repl/settings-repl-max-print-both-truncation-settings diff --git a/compiler/test-resources/repl/settings-repl-max-print-characters b/repl/test-resources/repl/settings-repl-max-print-characters similarity index 100% rename from compiler/test-resources/repl/settings-repl-max-print-characters rename to repl/test-resources/repl/settings-repl-max-print-characters diff --git a/compiler/test-resources/repl/settings-repl-max-print-elements b/repl/test-resources/repl/settings-repl-max-print-elements similarity index 100% rename from compiler/test-resources/repl/settings-repl-max-print-elements rename to repl/test-resources/repl/settings-repl-max-print-elements diff --git a/compiler/test-resources/repl/silent b/repl/test-resources/repl/silent similarity index 100% rename from compiler/test-resources/repl/silent rename to repl/test-resources/repl/silent diff --git a/compiler/test-resources/repl/top-level-block b/repl/test-resources/repl/top-level-block similarity index 100% rename from compiler/test-resources/repl/top-level-block rename to repl/test-resources/repl/top-level-block diff --git a/compiler/test-resources/repl/toplevelTry b/repl/test-resources/repl/toplevelTry similarity index 100% rename from compiler/test-resources/repl/toplevelTry rename to repl/test-resources/repl/toplevelTry diff --git a/compiler/test-resources/repl/unicodeChars b/repl/test-resources/repl/unicodeChars similarity index 100% rename from compiler/test-resources/repl/unicodeChars rename to repl/test-resources/repl/unicodeChars diff --git a/compiler/test-resources/repl/valueClassMember b/repl/test-resources/repl/valueClassMember similarity index 100% rename from compiler/test-resources/repl/valueClassMember rename to repl/test-resources/repl/valueClassMember diff --git a/compiler/test-resources/repl/varOrder b/repl/test-resources/repl/varOrder similarity index 100% rename from compiler/test-resources/repl/varOrder rename to repl/test-resources/repl/varOrder diff --git a/compiler/test-resources/type-printer/classDefs b/repl/test-resources/type-printer/classDefs similarity index 100% rename from compiler/test-resources/type-printer/classDefs rename to repl/test-resources/type-printer/classDefs diff --git a/compiler/test-resources/type-printer/defs b/repl/test-resources/type-printer/defs similarity index 100% rename from compiler/test-resources/type-printer/defs rename to repl/test-resources/type-printer/defs diff --git a/compiler/test-resources/type-printer/functions b/repl/test-resources/type-printer/functions similarity index 100% rename from compiler/test-resources/type-printer/functions rename to repl/test-resources/type-printer/functions diff --git a/compiler/test-resources/type-printer/hkAlias b/repl/test-resources/type-printer/hkAlias similarity index 100% rename from compiler/test-resources/type-printer/hkAlias rename to repl/test-resources/type-printer/hkAlias diff --git a/compiler/test-resources/type-printer/hkClass b/repl/test-resources/type-printer/hkClass similarity index 100% rename from compiler/test-resources/type-printer/hkClass rename to repl/test-resources/type-printer/hkClass diff --git a/compiler/test-resources/type-printer/infix b/repl/test-resources/type-printer/infix similarity index 100% rename from compiler/test-resources/type-printer/infix rename to repl/test-resources/type-printer/infix diff --git a/compiler/test-resources/type-printer/prefixless b/repl/test-resources/type-printer/prefixless similarity index 100% rename from compiler/test-resources/type-printer/prefixless rename to repl/test-resources/type-printer/prefixless diff --git a/compiler/test-resources/type-printer/source-compatible b/repl/test-resources/type-printer/source-compatible similarity index 100% rename from compiler/test-resources/type-printer/source-compatible rename to repl/test-resources/type-printer/source-compatible diff --git a/compiler/test-resources/type-printer/test-definitions b/repl/test-resources/type-printer/test-definitions similarity index 100% rename from compiler/test-resources/type-printer/test-definitions rename to repl/test-resources/type-printer/test-definitions diff --git a/compiler/test-resources/type-printer/type-mismatch b/repl/test-resources/type-printer/type-mismatch similarity index 100% rename from compiler/test-resources/type-printer/type-mismatch rename to repl/test-resources/type-printer/type-mismatch diff --git a/compiler/test-resources/type-printer/typeAliasInfix b/repl/test-resources/type-printer/typeAliasInfix similarity index 100% rename from compiler/test-resources/type-printer/typeAliasInfix rename to repl/test-resources/type-printer/typeAliasInfix diff --git a/compiler/test-resources/type-printer/vals b/repl/test-resources/type-printer/vals similarity index 100% rename from compiler/test-resources/type-printer/vals rename to repl/test-resources/type-printer/vals diff --git a/compiler/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala b/repl/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala similarity index 99% rename from compiler/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala rename to repl/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala index 1175900864e9..30ddc07a9b1d 100644 --- a/compiler/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala +++ b/repl/test/dotty/tools/repl/AbstractFileClassLoaderTest.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls diff --git a/compiler/test/dotty/tools/repl/DocTests.scala b/repl/test/dotty/tools/repl/DocTests.scala similarity index 100% rename from compiler/test/dotty/tools/repl/DocTests.scala rename to repl/test/dotty/tools/repl/DocTests.scala diff --git a/repl/test/dotty/tools/repl/JSR223Tests.scala b/repl/test/dotty/tools/repl/JSR223Tests.scala new file mode 100644 index 000000000000..2fd29fc9e548 --- /dev/null +++ b/repl/test/dotty/tools/repl/JSR223Tests.scala @@ -0,0 +1,40 @@ +package dotty.tools +package repl + +import org.junit.Test +import org.junit.AfterClass + +import vulpix.* + +import scala.concurrent.duration._ + +final class JSR223Tests: + + import JSR223Tests.{*, given} + + @Test def filetests: Unit = + given TestGroup = TestGroup("runWithCompiler") + compileFilesInDir("test-resources/jsr223", TestConfiguration.withReplOptions) + .checkRuns() + end filetests + +end JSR223Tests + +object JSR223Tests extends ParallelTesting: + + given report: SummaryReporting = new SummaryReport + + def maxDuration = 100.seconds + def numberOfSlaves = Runtime.getRuntime().availableProcessors() + def safeMode = dotty.Properties.testsSafeMode + def isInteractive = SummaryReport.isInteractive + def testFilter = dotty.Properties.testsFilter + def updateCheckFiles: Boolean = dotty.Properties.testsUpdateCheckfile + def failedTests = dotc.reporting.TestReporter.lastRunFailedTests + + @AfterClass def tearDown(): Unit = { + super.cleanup() + report.echoSummary() + } + +end JSR223Tests \ No newline at end of file diff --git a/compiler/test/dotty/tools/repl/JavaDefinedTests.scala b/repl/test/dotty/tools/repl/JavaDefinedTests.scala similarity index 92% rename from compiler/test/dotty/tools/repl/JavaDefinedTests.scala rename to repl/test/dotty/tools/repl/JavaDefinedTests.scala index 561111cf7eb1..e0bddd364fe1 100644 --- a/compiler/test/dotty/tools/repl/JavaDefinedTests.scala +++ b/repl/test/dotty/tools/repl/JavaDefinedTests.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import org.junit.Assert._ import org.junit.Test diff --git a/compiler/test/dotty/tools/repl/LoadTests.scala b/repl/test/dotty/tools/repl/LoadTests.scala similarity index 98% rename from compiler/test/dotty/tools/repl/LoadTests.scala rename to repl/test/dotty/tools/repl/LoadTests.scala index 309d6d05ecc4..d30e0fd533da 100644 --- a/compiler/test/dotty/tools/repl/LoadTests.scala +++ b/repl/test/dotty/tools/repl/LoadTests.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls diff --git a/compiler/test/dotty/tools/repl/ReplCompilerTests.scala b/repl/test/dotty/tools/repl/ReplCompilerTests.scala similarity index 99% rename from compiler/test/dotty/tools/repl/ReplCompilerTests.scala rename to repl/test/dotty/tools/repl/ReplCompilerTests.scala index 84610e9ee410..c148be0d27ca 100644 --- a/compiler/test/dotty/tools/repl/ReplCompilerTests.scala +++ b/repl/test/dotty/tools/repl/ReplCompilerTests.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls @@ -7,7 +8,7 @@ import java.util.regex.Pattern import org.junit.Assert.{assertEquals, assertFalse, assertTrue} import org.junit.Assert.{assertTrue => assert} import org.junit.Test -import dotty.tools.dotc.core.Contexts.Context +import dotc.core.Contexts.Context class ReplCompilerTests extends ReplTest: import ReplCompilerTests._ diff --git a/compiler/test/dotty/tools/repl/ReplTest.scala b/repl/test/dotty/tools/repl/ReplTest.scala similarity index 89% rename from compiler/test/dotty/tools/repl/ReplTest.scala rename to repl/test/dotty/tools/repl/ReplTest.scala index a0975d603ae1..f6f69d9879b1 100644 --- a/compiler/test/dotty/tools/repl/ReplTest.scala +++ b/repl/test/dotty/tools/repl/ReplTest.scala @@ -5,6 +5,9 @@ import scala.language.unsafeNulls import vulpix.TestConfiguration import vulpix.FileDiff +import dotty.tools.ToolName +import dotty.tools.readLines +import dotty.tools.toolArgsFor import java.lang.System.{lineSeparator => EOL} import java.io.{ByteArrayOutputStream, File => JFile, PrintStream} @@ -14,8 +17,8 @@ import scala.io.Source import scala.util.Using import scala.collection.mutable.ArrayBuffer -import dotty.tools.dotc.core.Contexts.Context -import dotty.tools.dotc.reporting.MessageRendering +import dotc.core.Contexts.Context +import dotc.reporting.MessageRendering import org.junit.{After, Before} import org.junit.Assert._ @@ -47,7 +50,8 @@ extends ReplDriver(options, new PrintStream(out, true, StandardCharsets.UTF_8.na extension [A](state: State) infix def andThen(op: State ?=> A): A = op(using state) - def testFile(f: JFile): Unit = testScript(f.toString, readLines(f), Some(f)) + def testFile(f: JFile): Unit = + testScript(f.toString, readLines(f), Some(f)) def testScript(name: => String, lines: List[String], scriptFile: Option[JFile] = None): Unit = { val prompt = "scala>" @@ -98,7 +102,7 @@ extends ReplDriver(options, new PrintStream(out, true, StandardCharsets.UTF_8.na FileDiff.dump(checkFile.toPath.toString, actualOutput) println(s"Wrote updated script file to $checkFile") else - println(dotc.util.DiffUtil.mkColoredHorizontalLineDiff(actualOutput.mkString(EOL), expectedOutput.mkString(EOL))) + println(dotty.tools.dotc.util.DiffUtil.mkColoredHorizontalLineDiff(actualOutput.mkString(EOL), expectedOutput.mkString(EOL))) fail(s"Error in script $name, expected output did not match actual") end if @@ -106,5 +110,5 @@ extends ReplDriver(options, new PrintStream(out, true, StandardCharsets.UTF_8.na object ReplTest: val commonOptions = Array("-color:never", "-pagewidth", "80") - val defaultOptions = commonOptions ++ Array("-classpath", TestConfiguration.basicClasspath) - lazy val withStagingOptions = commonOptions ++ Array("-classpath", TestConfiguration.withStagingClasspath) + val defaultOptions = commonOptions ++ Array("-classpath", TestConfiguration.replClassPath) + lazy val withStagingOptions = commonOptions ++ Array("-classpath", TestConfiguration.replWithStagingClasspath) diff --git a/repl/test/dotty/tools/repl/ScriptedTests.scala b/repl/test/dotty/tools/repl/ScriptedTests.scala new file mode 100644 index 000000000000..f9de846bf7d7 --- /dev/null +++ b/repl/test/dotty/tools/repl/ScriptedTests.scala @@ -0,0 +1,24 @@ +package dotty.tools +package repl + +import org.junit.Test + +import java.io.File + +final class ScriptedTests extends ReplTest: + + private def scripts(path: String): Array[File] = + val dir = new File(path) + assert(dir.exists && dir.isDirectory, "Couldn't load scripts dir") + dir.listFiles.filter: file => + val path = if file.isDirectory then file.getPath + "/" else file.getPath + dotty.Properties.testsFilter.isEmpty || dotty.Properties.testsFilter.exists(path.contains) + end scripts + + @Test def replTests = scripts("test-resources/repl").foreach(testFile) + + @Test def replMacrosTests = scripts("test-resources/repl-macros").foreach(testFile) + + @Test def typePrinterTests = scripts("test-resources/type-printer").foreach(testFile) + +object ScriptedTests diff --git a/compiler/test/dotty/tools/repl/ShadowingBatchTests.scala b/repl/test/dotty/tools/repl/ShadowingBatchTests.scala similarity index 97% rename from compiler/test/dotty/tools/repl/ShadowingBatchTests.scala rename to repl/test/dotty/tools/repl/ShadowingBatchTests.scala index 7272c10aa003..08436c5caf58 100644 --- a/compiler/test/dotty/tools/repl/ShadowingBatchTests.scala +++ b/repl/test/dotty/tools/repl/ShadowingBatchTests.scala @@ -8,7 +8,7 @@ import java.nio.file.Files import org.junit.{ After, AfterClass, BeforeClass, Test } import org.junit.Assert._ -import io.{ Directory, PlainDirectory } +import dotty.tools.io.{ Directory, PlainDirectory } import dotc.core.Contexts._ import dotc.reporting.{ ErrorMessagesTest, StoreReporter } @@ -23,7 +23,7 @@ class ShadowingBatchTests extends ErrorMessagesTest: @After def testFinished: Unit = dir.list.foreach(_.deleteRecursively()) - val compiler = new dotc.Compiler() + val compiler = new dotty.tools.dotc.Compiler() override def initializeCtx(ictx: FreshContext) = inContext(ictx) { super.initializeCtx(ictx) diff --git a/compiler/test/dotty/tools/repl/ShadowingTests.scala b/repl/test/dotty/tools/repl/ShadowingTests.scala similarity index 100% rename from compiler/test/dotty/tools/repl/ShadowingTests.scala rename to repl/test/dotty/tools/repl/ShadowingTests.scala diff --git a/compiler/test/dotty/tools/repl/TabcompleteTests.scala b/repl/test/dotty/tools/repl/TabcompleteTests.scala similarity index 99% rename from compiler/test/dotty/tools/repl/TabcompleteTests.scala rename to repl/test/dotty/tools/repl/TabcompleteTests.scala index ad0f13b3a497..d3284402f58b 100644 --- a/compiler/test/dotty/tools/repl/TabcompleteTests.scala +++ b/repl/test/dotty/tools/repl/TabcompleteTests.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import scala.language.unsafeNulls diff --git a/compiler/test/dotty/tools/repl/TypeTests.scala b/repl/test/dotty/tools/repl/TypeTests.scala similarity index 95% rename from compiler/test/dotty/tools/repl/TypeTests.scala rename to repl/test/dotty/tools/repl/TypeTests.scala index d864d61d07aa..a1d63d3595a0 100644 --- a/compiler/test/dotty/tools/repl/TypeTests.scala +++ b/repl/test/dotty/tools/repl/TypeTests.scala @@ -1,4 +1,5 @@ -package dotty.tools.repl +package dotty.tools +package repl import org.junit.Assert.* import org.junit.Test diff --git a/sbt-bridge/src/xsbt/ConsoleInterface.java b/sbt-bridge/src-bootstrapped/ConsoleInterface.java similarity index 100% rename from sbt-bridge/src/xsbt/ConsoleInterface.java rename to sbt-bridge/src-bootstrapped/ConsoleInterface.java diff --git a/scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompiler.scala b/scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompiler.scala index 514155165ea7..b13b5e9756ea 100644 --- a/scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompiler.scala +++ b/scaladoc/src/dotty/tools/scaladoc/snippets/SnippetCompiler.scala @@ -13,7 +13,7 @@ import dotty.tools.dotc.reporting.{ Diagnostic, StoreReporter } import dotty.tools.dotc.parsing.Parsers.Parser import dotty.tools.dotc.{ Compiler, Run } import dotty.tools.io.{AbstractFile, VirtualDirectory} -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader import dotty.tools.dotc.util.Spans._ import dotty.tools.dotc.interfaces.Diagnostic._ import dotty.tools.dotc.util.{ SourcePosition, NoSourcePosition, SourceFile, NoSource } diff --git a/staging/src/scala/quoted/staging/QuoteDriver.scala b/staging/src/scala/quoted/staging/QuoteDriver.scala index 813d8d8c16be..2325473f2318 100644 --- a/staging/src/scala/quoted/staging/QuoteDriver.scala +++ b/staging/src/scala/quoted/staging/QuoteDriver.scala @@ -6,7 +6,7 @@ import dotty.tools.dotc.Driver import dotty.tools.dotc.core.Contexts.{Context, ContextBase, FreshContext} import dotty.tools.dotc.quoted.QuotesCache import dotty.tools.io.{AbstractFile, Directory, PlainDirectory, VirtualDirectory} -import dotty.tools.repl.AbstractFileClassLoader +import dotty.tools.io.AbstractFileClassLoader import dotty.tools.dotc.reporting._ import dotty.tools.dotc.config.Settings.Setting.value import dotty.tools.dotc.util.ClasspathFromClassloader @@ -61,7 +61,7 @@ private class QuoteDriver(appClassloader: ClassLoader) extends Driver: case Left(classname) => assert(!ctx.reporter.hasErrors) - val classLoader = new AbstractFileClassLoader(outDir, appClassloader, "false") + val classLoader = new AbstractFileClassLoader(outDir, appClassloader) val clazz = classLoader.loadClass(classname) val method = clazz.getMethod("apply")