Skip to content

Commit

Permalink
First compile in scala 3 without adding patches
Browse files Browse the repository at this point in the history
To avoid computing unecessary patches
  • Loading branch information
mlachkar committed Mar 4, 2021
1 parent 6e4e165 commit 8cacf23
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 28 deletions.
76 changes: 48 additions & 28 deletions migrate/src/main/scala/migrate/ScalaMigrat.scala
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,23 @@ class ScalaMigrat(scalafixSrv: ScalafixService) {
for {
compiler <- setupScala3Compiler(scala3Classpath, scala3ClassDirectory, scala3CompilerOptions)
(scalaFiles, javaFiles) = unmanagedSources.partition(_.value.endsWith("scala"))
initialFileToMigrate <-
buildMigrationFiles(scalaFiles)
_ <- compileInScala3(initialFileToMigrate, javaFiles ++ managedSources, compiler)
initialFileToMigrate <-
buildMigrationFiles(unmanagedSources)
_ <- compileInScala3(initialFileToMigrate, managedSources, compiler)
migratedFiles = initialFileToMigrate.map(f => (f.source, f.migrate(compiler))).toMap
// first try to compile without adding any patch
isSuccess =
compileInScala3(
(unmanagedSources ++ managedSources).map(path => new CompilationUnit(path.value, FileUtils.read(path))),
compiler
).isSuccess
migratedFiles <- if (isSuccess) {
Success(Map[AbsolutePath, FileMigrationState.FinalState]())
} else {
for {
initialFileToMigrate <- buildMigrationFiles(scalaFiles)
_ <- compileInScala3(initialFileToMigrate, javaFiles ++ managedSources, compiler)
initialFileToMigrate <- buildMigrationFiles(unmanagedSources)
_ <- compileInScala3(initialFileToMigrate, managedSources, compiler)
migratedFiles = initialFileToMigrate.map(f => (f.source, f.migrate(compiler))).toMap
} yield migratedFiles
}
} yield migratedFiles
}

Expand Down Expand Up @@ -100,7 +110,12 @@ class ScalaMigrat(scalafixSrv: ScalafixService) {
for {
cuUnmanagedSources <- migrationFiles.map(_.previewAllPatches()).sequence
cuManagedSources = managedSources.map(path => new CompilationUnit(path.value, FileUtils.read(path)))
_ <- timeAndLog(Try(compiler.compileAndReport(cuManagedSources.toList ++ cuUnmanagedSources.toList, reporter))) {
_ <- compileInScala3(cuUnmanagedSources ++ cuManagedSources, compiler)
} yield ()

private def compileInScala3(compilationUnits: Seq[CompilationUnit], compiler: Scala3Compiler): Try[Unit] =
for {
_ <- timeAndLog(Try(compiler.compileAndReport(compilationUnits.toList, reporter))) {
case (finiteDuration, Success(_)) =>
scribe.info(s"Successfully compiled with scala 3 in $finiteDuration")
case (_, Failure(e)) =>
Expand All @@ -111,28 +126,33 @@ class ScalaMigrat(scalafixSrv: ScalafixService) {
} yield ()

private def buildMigrationFiles(unmanagedSources: Seq[AbsolutePath]): Try[Seq[FileMigrationState.Initial]] =
for {
fileEvaluations <-
timeAndLog(scalafixSrv.inferTypesAndImplicits(unmanagedSources)) {
case (duration, Success(files)) =>
val fileEvaluationsSeq = files.getFileEvaluations().toSeq
val patchesCount = fileEvaluationsSeq.map(_.getPatches().size).sum
scribe.info(s"Found ${patchesCount} patch candidate(s) in ${unmanagedSources.size} file(s)after $duration")
case (_, Failure(e)) =>
scribe.info(s"""|Failed inferring types
|Cause ${e.getMessage()}""".stripMargin)
}
fileEvaluationMap <- fileEvaluations
.getFileEvaluations()
.toSeq
.map(e => AbsolutePath.from(e.getEvaluatedFile()).map(file => file -> e))
.sequence
.map(_.toMap)
fileToMigrate <-
unmanagedSources.map(src => fileEvaluationMap.get(src).map(FileMigrationState.Initial).toTry).sequence
} yield fileToMigrate
if (unmanagedSources.isEmpty) Success(Seq())
else
for {
fileEvaluations <-
timeAndLog(scalafixSrv.inferTypesAndImplicits(unmanagedSources)) {
case (duration, Success(files)) =>
val fileEvaluationsSeq = files.getFileEvaluations().toSeq
val patchesCount = fileEvaluationsSeq.map(_.getPatches().size).sum
scribe.info(
s"Found ${patchesCount} patch candidate(s) in ${unmanagedSources.size} file(s)after $duration"
)
case (_, Failure(e)) =>
scribe.info(s"""|Failed inferring types
|Cause ${e.getMessage()}""".stripMargin)
}
fileEvaluationMap <- fileEvaluations
.getFileEvaluations()
.toSeq
.map(e => AbsolutePath.from(e.getEvaluatedFile()).map(file => file -> e))
.sequence
.map(_.toMap)
fileToMigrate <-
unmanagedSources.map(src => fileEvaluationMap.get(src).map(FileMigrationState.Initial).toTry).sequence
} yield fileToMigrate

}

object ScalaMigrat {
def migrateScalacOptions(scalacOptions: Seq[String]): MigratedScalacOptions = {
val sanitized = ScalacOption.sanitizeScalacOption(scalacOptions)
Expand Down
5 changes: 5 additions & 0 deletions project/project/metals.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// DO NOT EDIT! This file is auto-generated.
// This file makes sure that the JDI tools are in the sbt classpath.
// JDI tools are used by the debug adapter server.

addSbtPlugin("org.scala-debugger" % "sbt-jdi-tools" % "1.1.1")

0 comments on commit 8cacf23

Please sign in to comment.