Skip to content

Commit

Permalink
Port tests form scala2-library-tasty-tests to normal tests
Browse files Browse the repository at this point in the history
Split BootstrappedStdLibTASYyTest into the part that tests the TASTy
inspector and the part that tests recompilation.

We also remove `scala2-library-tasty-tests` as it is now empty and will
not serve any purpose anymore.
  • Loading branch information
nicolasstucki committed Feb 7, 2024
1 parent f1bad54 commit 30403cf
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 203 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ jobs:

- name: Cmd Tests
run: |
./project/scripts/sbt ";dist/pack; scala3-bootstrapped/compile; scala3-bootstrapped/test ;sbt-test/scripted scala2-compat/*; scala2-library-tasty-tests/test; scala3-compiler-bootstrapped/scala3CompilerCoursierTest:test"
./project/scripts/sbt ";dist/pack; scala3-bootstrapped/compile; scala3-bootstrapped/test ;sbt-test/scripted scala2-compat/*; scala3-compiler-bootstrapped/scala3CompilerCoursierTest:test"
./project/scripts/cmdTests
./project/scripts/bootstrappedOnlyCmdTests
Expand Down Expand Up @@ -547,7 +547,7 @@ jobs:

- name: Test
run: |
./project/scripts/sbt ";dist/pack ;scala3-bootstrapped/compile ;scala3-bootstrapped/test ;sbt-test/scripted scala2-compat/*; scala2-library-tasty-tests/test"
./project/scripts/sbt ";dist/pack ;scala3-bootstrapped/compile ;scala3-bootstrapped/test ;sbt-test/scripted scala2-compat/*"
./project/scripts/cmdTests
./project/scripts/bootstrappedOnlyCmdTests
Expand Down
1 change: 0 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ val `scala3-bench-bootstrapped` = Build.`scala3-bench-bootstrapped`
val `scala3-bench-micro` = Build.`scala3-bench-micro`
val `scala2-library-bootstrapped` = Build.`scala2-library-bootstrapped`
val `scala2-library-tasty` = Build.`scala2-library-tasty`
val `scala2-library-tasty-tests` = Build.`scala2-library-tasty-tests`
val `scala2-library-cc` = Build.`scala2-library-cc`
val `scala2-library-cc-tasty` = Build.`scala2-library-cc-tasty`
val `tasty-core` = Build.`tasty-core`
Expand Down
26 changes: 0 additions & 26 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1247,32 +1247,6 @@ object Build {
},
)

/** Test the tasty generated by `scala2-library-bootstrapped`
*
* The sources in src are compiled using TASTy from scala2-library-tasty but then run
* with the scala-library compiled be Scala 2.
*
* The tests are run with the bootstrapped compiler and the tasty inspector on the classpath.
* The classpath has the default `scala-library` and not `scala2-library-bootstrapped`.
*
* The jar of `scala2-library-bootstrapped` is provided for to the tests.
* - inspector: test that we can load the contents of the jar using the tasty inspector
* - from-tasty: test that we can recompile the contents of the jar using `dotc -from-tasty`
*/
lazy val `scala2-library-tasty-tests` = project.in(file("scala2-library-tasty-tests")).
withCommonSettings(Bootstrapped).
dependsOn(dottyCompiler(Bootstrapped) % "compile->compile").
dependsOn(`scala3-tasty-inspector` % "test->test").
dependsOn(`scala2-library-tasty`).
settings(commonBootstrappedSettings).
settings(
javaOptions := (`scala3-compiler-bootstrapped` / javaOptions).value,
Test / javaOptions += "-Ddotty.scala.library=" + (`scala2-library-bootstrapped` / Compile / packageBin).value.getAbsolutePath,
Compile / compile / fullClasspath ~= {
_.filterNot(file => file.data.getName == s"scala-library-$stdlibBootstrappedVersion.jar")
},
)

lazy val `scala3-sbt-bridge` = project.in(file("sbt-bridge/src")).
// We cannot depend on any bootstrapped project to compile the bridge, since the
// bridge is needed to compile these projects.
Expand Down
174 changes: 0 additions & 174 deletions scala2-library-tasty-tests/test/BootstrappedStdLibTASYyTest.scala

This file was deleted.

52 changes: 52 additions & 0 deletions tests/run-tasty-inspector/scala2-library-test.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import scala.quoted._
import scala.tasty.inspector._

import dotty.tools.io.Directory

import java.io.File.pathSeparator

@main def Test: Unit =
blacklistsOnlyContainsClassesThatExist()
testTastyInspector()

/** Test that we can load trees from TASTy */
def testTastyInspector(): Unit =
loadWithTastyInspector(loadBlacklisted)

def blacklistsOnlyContainsClassesThatExist() =
val scalaLibTastyPathsSet = scalaLibTastyPaths.toSet
assert(loadBlacklisted.diff(scalaLibTastyPathsSet).isEmpty,
loadBlacklisted.diff(scalaLibTastyPathsSet).mkString(
"`loadBlacklisted` contains names that are not in `scalaLibTastyPaths`: \n ", "\n ", "\n\n"))

def dottyVersion =
System.getProperty("java.class.path").nn.split(pathSeparator).collectFirst {
case path if path.endsWith(".jar") && path.contains("/scala3-library_3-") =>
path.split("/scala3-library_3-").last.stripSuffix(".jar")
}.get

def scalaLibClassesPath =
java.nio.file.Paths.get(
s"out/bootstrap/scala2-library-bootstrapped/scala-$dottyVersion-nonbootstrapped/classes")

lazy val scalaLibTastyPaths =
new Directory(scalaLibClassesPath).deepFiles
.filter(_.`extension` == "tasty")
.map(_.normalize.path.stripPrefix(scalaLibClassesPath.toString + "/"))
.toList

def loadWithTastyInspector(blacklisted: Set[String]): Unit =
val inspector = new scala.tasty.inspector.Inspector {
def inspect(using Quotes)(tastys: List[Tasty[quotes.type]]): Unit =
for tasty <- tastys do
tasty.ast.show(using quotes.reflect.Printer.TreeStructure) // Check that we can traverse the full tree
()
}
val tastyFiles = scalaLibTastyPaths.filterNot(blacklisted)
val isSuccess = TastyInspector.inspectTastyFiles(tastyFiles.map(x => scalaLibClassesPath.resolve(x).toString))(inspector)
assert(isSuccess, "Errors reported while loading from TASTy")

/** Set of tasty files that cannot be loaded from TASTy */
def loadBlacklisted = Set[String](
// No issues :)
)
91 changes: 91 additions & 0 deletions tests/run-with-compiler/scala2-library-from-tasty.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import dotty.tools.io.Directory
import dotty.tools.dotc.util.ClasspathFromClassloader

import java.io.File.pathSeparator
import java.io.File.separator

@main def Test: Unit =
blacklistsOnlyContainsClassesThatExist()
testFromTastyInJar()
testFromTasty()

/** Test that we can load and compile trees from TASTy in a Jar */
def testFromTastyInJar(): Unit =
compileFromTastyInJar(compileBlacklisted)

/** Test that we can load and compile trees from TASTy */
def testFromTasty(): Unit =
compileFromTasty(compileBlacklisted)

def blacklistsOnlyContainsClassesThatExist() =
val scalaLibTastyPathsSet = scalaLibTastyPaths.toSet
assert(compileBlacklisted.diff(scalaLibTastyPathsSet).isEmpty,
compileBlacklisted.diff(scalaLibTastyPathsSet).mkString(
"`loadBlacklisted` contains names that are not in `scalaLibTastyPaths`: \n ", "\n ", "\n\n"))

def dottyVersion =
System.getProperty("java.class.path").nn.split(pathSeparator).collectFirst {
case path if path.endsWith(".jar") && path.contains("/scala3-library_3-") =>
path.split("/scala3-library_3-").last.stripSuffix(".jar")
}.get

def scalaLibJarPath =
s"out/bootstrap/scala2-library-tasty/scala-$dottyVersion-nonbootstrapped/scala2-library-tasty_3-$dottyVersion.jar"

def scalaLibClassesPath =
java.nio.file.Paths.get(
s"out/bootstrap/scala2-library-bootstrapped/scala-$dottyVersion-nonbootstrapped/classes")

lazy val scalaLibTastyPaths =
new Directory(scalaLibClassesPath).deepFiles
.filter(_.`extension` == "tasty")
.map(_.normalize.path.stripPrefix(scalaLibClassesPath.toString + "/"))
.toList

def compileFromTastyInJar(blacklisted: Set[String]): Unit = {
val driver = new dotty.tools.dotc.Driver
val yFromTastyBlacklist =
blacklisted.mkString("-Yfrom-tasty-ignore-list:", ",", "")
val args = Array(
"-classpath", ClasspathFromClassloader(getClass.getClassLoader),
"-from-tasty",
"-nowarn",
yFromTastyBlacklist,
scalaLibJarPath,
)
val reporter = driver.process(args)
assert(reporter.errorCount == 0, "Errors while re-compiling")
}

def compileFromTasty(blacklisted: Set[String]): Unit = {
val driver = new dotty.tools.dotc.Driver
val tastyFiles = scalaLibTastyPaths.filterNot(blacklisted)
val args = Array(
"-classpath", ClasspathFromClassloader(getClass.getClassLoader),
"-from-tasty",
"-nowarn",
) ++ tastyFiles.map(x => scalaLibClassesPath.resolve(x).toString)
val reporter = driver.process(args)
assert(reporter.errorCount == 0, "Errors while re-compiling")
}

/** Set of tasty files that cannot be recompiled from TASTy */
def compileBlacklisted = Set[String](
// See #10048
// failed: java.lang.AssertionError: assertion failed: class Boolean
// at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.assertClassNotArrayNotPrimitive(BCodeHelpers.scala:247)
// at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.getClassBTypeAndRegisterInnerClass(BCodeHelpers.scala:265)
// at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.getClassBTypeAndRegisterInnerClass$(BCodeHelpers.scala:210)
// at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.getClassBTypeAndRegisterInnerClass(BCodeSkelBuilder.scala:62)
// at dotty.tools.backend.jvm.BCodeHelpers$BCInnerClassGen.internalName(BCodeHelpers.scala:237)
"scala/Array.tasty",
"scala/Boolean.tasty",
"scala/Byte.tasty",
"scala/Char.tasty",
"scala/Double.tasty",
"scala/Float.tasty",
"scala/Int.tasty",
"scala/Long.tasty",
"scala/Short.tasty",
"scala/Unit.tasty",
).map(_.replace("/", separator))

0 comments on commit 30403cf

Please sign in to comment.