From 9cca4ab13edaad748fccfef0ad6b82916cdc6f9d Mon Sep 17 00:00:00 2001 From: tgodzik Date: Mon, 6 Sep 2021 16:17:41 +0200 Subject: [PATCH] Fix issue with tmp directory popping up in random places Previously, we would try to relatavize a path even if it isn't contained in the workspace. This might cause tmp folder with the created semanticdb popping up in weird places. The reason for that is that we would get a path like `../../../../tmp` and would resolve it from tmp directory. This sometimes would make the smeanticdb file generated for warming up scalafix to show in workspace directory. Now, we only try to resolve files for organize imports for workspace files and also create the temporary warmup files in `.metals` directory --- .../internal/metals/ScalafixProvider.scala | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala b/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala index e07c4df8b27..9788775c2d1 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/ScalafixProvider.scala @@ -9,6 +9,7 @@ import scala.collection.concurrent.TrieMap import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.util.Failure +import scala.util.Random import scala.util.Success import scala.util.Try @@ -50,7 +51,9 @@ case class ScalafixProvider( val targets = buildTargets.all.toList.groupBy(_.scalaVersion).flatMap { case (_, targets) => targets.headOption } - val tmp = AbsolutePath(Files.createTempFile("metals", ".scala")) + val tmp = workspace + .resolve(Directories.tmp) + .resolve(s"Main${Random.nextLong()}.scala") val contents = "object Main{}\n" tmp.writeText(contents) for (target <- targets) @@ -150,12 +153,13 @@ case class ScalafixProvider( else semanticdb val dir = workspace.resolve(Directories.tmp) - val relativePath = file.toRelative(workspace) - val writeTo = dir.resolve(SemanticdbClasspath.fromScala(relativePath)) - writeTo.parent.createDirectories() - val docs = TextDocuments(Seq(toSave)) - Files.write(writeTo.toNIO, docs.toByteArray) - Some(dir.toNIO) + file.toRelativeInside(workspace).flatMap { relativePath => + val writeTo = dir.resolve(SemanticdbClasspath.fromScala(relativePath)) + writeTo.parent.createDirectories() + val docs = TextDocuments(Seq(toSave)) + Files.write(writeTo.toNIO, docs.toByteArray) + Option(dir.toNIO) + } } } @@ -258,10 +262,14 @@ case class ScalafixProvider( else workspace val diskFilePath = if (produceSemanticdb) { - val relativePath = file.toRelative(workspace) - val tempFilePath = sourceroot.resolve(relativePath) - tempFilePath.writeText(inBuffers) - tempFilePath + file + .toRelativeInside(workspace) + .map { relativePath => + val tempFilePath = sourceroot.resolve(relativePath) + tempFilePath.writeText(inBuffers) + tempFilePath + } + .getOrElse(file) } else { file }