11package com .typesafe .tools .mima .lib
22
3- import java .io .{ ByteArrayOutputStream , PrintStream }
3+ import java .io .{ ByteArrayOutputStream , File , PrintStream }
44import java .net .{ URI , URLClassLoader }
55import javax .tools ._
66
77import scala .collection .JavaConverters ._
88import scala .collection .mutable
9- import scala .reflect .internal .util .{ BatchSourceFile , SourceFile }
9+ import scala .reflect .internal .util .BatchSourceFile
1010import scala .reflect .io .{ Directory , Path , PlainFile }
1111import scala .util .{ Failure , Success , Try }
1212
@@ -25,32 +25,36 @@ final class TestCase(val baseDir: Directory, val scalaCompiler: ScalaCompiler, v
2525 val outApp = (baseDir / s " target/scala- $scalaBinaryVersion/app-classes " ).toDirectory
2626
2727 lazy val compileThem : Try [Unit ] = for {
28- () <- Try (List (outV1, outV2, outApp).foreach(recreateDir(_)))
29- () <- compileDir(srcV1, outV1)
30- () <- compileDir(srcApp, outApp)
31- () <- compileDir(srcV2, outV2) // run after App, to make sure App links to v1
28+ () <- compileV1()
29+ () <- compileV2()
30+ () <- compileApp(outV1)
3231 } yield ()
3332
34- def compileDir (srcDir : Directory , out : Directory ): Try [Unit ] = {
35- val sourceFiles = srcDir.files.map(f => new BatchSourceFile (new PlainFile (f))).toList
36- for {
37- () <- compileScala(sourceFiles, out)
38- () <- compileJava(sourceFiles.filter(_.isJava), out)
39- } yield ()
40- }
33+ def compileV1 () = compileDir(srcV1, Nil , outV1)
34+ def compileV2 () = compileDir(srcV2, Nil , outV2)
35+ def compileApp (outLib : Directory ) = compileDir(srcApp, List (outLib), outApp)
36+
37+ def compileDir (srcDir : Directory , cp : List [Directory ], out : Directory ): Try [Unit ] = for {
38+ () <- Try (recreateDir(out))
39+ () <- compileScala(srcDir, cp, out)
40+ () <- compileJava(srcDir, cp, out)
41+ } yield ()
4142
42- def compileScala (sourceFiles : List [SourceFile ], out : Directory ): Try [Unit ] = {
43+ def compileScala (srcDir : Directory , cp : List [Directory ], out : Directory ): Try [Unit ] = {
44+ val sourceFiles = lsSrcs(srcDir)
4345 if (sourceFiles.forall(_.isJava)) return Success (())
4446 val bootcp = ClassPath .join(scalaJars.map(_.getPath))
47+ val cpOpt = if (cp.isEmpty) Nil else List (" -cp" , ClassPath .join(cp.map(_.path)))
4548 val paths = sourceFiles.map(_.path)
46- val args = " -bootclasspath" :: bootcp :: " -classpath " :: s " $outV1 " :: " -d" :: s " $out" :: paths
49+ val args = " -bootclasspath" :: bootcp :: cpOpt : :: " -d" :: s " $out" :: paths
4750 scalaCompiler.compile(args)
4851 }
4952
50- def compileJava (sourceFiles : List [SourceFile ], out : Directory ): Try [Unit ] = {
53+ def compileJava (srcDir : Directory , cp : List [Directory ], out : Directory ): Try [Unit ] = {
54+ val sourceFiles = lsSrcs(srcDir, _.hasExtension(" java" ))
5155 if (sourceFiles.isEmpty) return Success (())
52- val cp = ClassPath .join((scalaJars :+ outV1. jfile).map(_.getPath))
53- val opts = List (" -classpath" , cp , " -d" , s " $out" ).asJava
56+ val cpStr = ClassPath .join((scalaJars ++ cp.map(_. jfile) ).map(_.getPath))
57+ val opts = List (" -classpath" , cpStr , " -d" , s " $out" ).asJava
5458 val units = sourceFiles.map { sf =>
5559 new SimpleJavaFileObject (new URI (s " string:/// ${sf.path}" ), JavaFileObject .Kind .SOURCE ) {
5660 override def getCharContent (ignoreEncodingErrors : Boolean ) = sf.content
@@ -86,6 +90,12 @@ final class TestCase(val baseDir: Directory, val scalaCompiler: ScalaCompiler, v
8690 }
8791 }
8892
93+ def lsSrcs (dir : Directory , cond : Path => Boolean = _.hasExtension(" scala" , " java" )) = {
94+ dir.walkFilter(cond).map(f => new BatchSourceFile (new PlainFile (f))).toList.sortBy(_.path)
95+ }
96+
97+ def blankFile (p : Path ): Boolean = p.toFile.lines().forall(_.startsWith(" #" ))
98+
8999 def versionedFile (path : Path ) = {
90100 val p = baseDir.resolve(path).toFile
91101 val p211 = (p.parent / (s " ${p.stripExtension}-2.11 " )).addExtension(p.extension).toFile
@@ -97,10 +107,11 @@ final class TestCase(val baseDir: Directory, val scalaCompiler: ScalaCompiler, v
97107 }
98108 }
99109
100- def recreateDir (dir : Directory ) = {
110+ def recreateDir (dir : Directory ): Unit = {
101111 if (dir.exists)
102112 assert(dir.deleteRecursively(), s " failed to delete $dir" )
103113 dir.createDirectory()
114+ ()
104115 }
105116
106117 override def toString = s " TestCase(baseDir= ${baseDir.name}, scalaVersion= ${scalaCompiler.version}) "
0 commit comments