From 69293ee3a8870ee6a097f8b780a68b47fa238ec0 Mon Sep 17 00:00:00 2001 From: kasiaMarek Date: Wed, 15 Jan 2025 16:38:30 +0100 Subject: [PATCH] review changes --- .../meta/internal/metals/Compilations.scala | 31 ++++--------------- .../meta/internal/metals/FileChanges.scala | 9 ++++-- .../internal/metals/MetalsLspService.scala | 7 ++--- .../metals/MutableMd5Fingerprints.scala | 7 ++++- 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/metals/src/main/scala/scala/meta/internal/metals/Compilations.scala b/metals/src/main/scala/scala/meta/internal/metals/Compilations.scala index 58e93c9123f..3559a1f9d66 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/Compilations.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/Compilations.scala @@ -23,7 +23,6 @@ import ch.epfl.scala.{bsp4j => b} final class Compilations( buildTargets: BuildTargets, classes: BuildTargetClasses, - workspace: () => AbsolutePath, languageClient: MetalsLanguageClient, refreshTestSuites: () => Unit, afterSuccessfulCompilation: () => Unit, @@ -89,9 +88,11 @@ final class Compilations( source: AbsolutePath, compileInverseDependencies: Boolean, ): Future[Unit] = - expand(source).flatMap(targets => - compilationFinished(targets.toSeq, compileInverseDependencies) - ) + fileChanges + .expand(source) + .flatMap(targets => + compilationFinished(targets.toSeq, compileInverseDependencies) + ) def compileTarget( target: b.BuildTargetIdentifier @@ -196,28 +197,8 @@ final class Compilations( .ignoreValue } - private def expand( - path: AbsolutePath - ): Future[Option[b.BuildTargetIdentifier]] = { - val isCompilable = - (path.isScalaOrJava || path.isSbt) && - !path.isDependencySource(workspace()) && - !path.isInTmpDirectory(workspace()) - - if (isCompilable) { - val targetOpt = buildTargets.inverseSourcesBsp(path) - targetOpt.foreach { - case tgts if tgts.isEmpty => scribe.warn(s"no build target for: $path") - case _ => - } - - targetOpt - } else - Future.successful(None) - } - def expand(paths: Seq[AbsolutePath]): Future[Seq[b.BuildTargetIdentifier]] = { - val expansions = paths.map(expand) + val expansions = paths.map(fileChanges.expand) Future.sequence(expansions).map(_.flatten) } diff --git a/metals/src/main/scala/scala/meta/internal/metals/FileChanges.scala b/metals/src/main/scala/scala/meta/internal/metals/FileChanges.scala index e1d1d9f8c01..f6992c7865e 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/FileChanges.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/FileChanges.scala @@ -42,6 +42,11 @@ class FileChanges(buildTargets: BuildTargets, workspace: () => AbsolutePath)( allToCompile } + /** + * The `assumeDidNotChange` should be set when we want to assume that the file did not change + * if it is not present in the `previousSignatures` (opened for the first time), + * we set it to `true` for operations such as `didFocus` or `didOpen`. + */ def buildTargetToCompile( path: AbsolutePath, fingerprint: Option[Fingerprint], @@ -78,7 +83,7 @@ class FileChanges(buildTargets: BuildTargets, workspace: () => AbsolutePath)( ) } - private def expand( + def expand( path: AbsolutePath ): Future[Option[BuildTargetIdentifier]] = { val isCompilable = @@ -121,7 +126,7 @@ class FileChanges(buildTargets: BuildTargets, workspace: () => AbsolutePath)( fingerprint .map { fingerprint => synchronized { - if (previousSignatures.getOrElse(path, null) == fingerprint.md5) + if (previousSignatures.getOrElse(path, "") == fingerprint.md5) false else { previousSignatures.put(path, fingerprint.md5) diff --git a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala index e03978387bd..64d0601ad95 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala @@ -210,7 +210,6 @@ abstract class MetalsLspService( val compilations: Compilations = new Compilations( buildTargets, buildTargetClasses, - () => folder, languageClient, () => testProvider.refreshTestSuites.apply(()), () => { @@ -923,7 +922,7 @@ abstract class MetalsLspService( Future .sequence( List( - compilations.compileFiles(List((path, null))), + compilations.compileFiles(List((path, Fingerprint.empty))), Future { diagnostics.didDelete(path) testProvider.onFileDelete(path) @@ -1192,9 +1191,7 @@ abstract class MetalsLspService( thresholdMillis = 1.second.toMillis, ) { val path = params.getTextDocument.getUri.toAbsolutePath - codeLensProvider.findLenses(path).map(_.toList.asJava).map { found => - found - } + codeLensProvider.findLenses(path).map(_.toList.asJava) } } } diff --git a/metals/src/main/scala/scala/meta/internal/metals/MutableMd5Fingerprints.scala b/metals/src/main/scala/scala/meta/internal/metals/MutableMd5Fingerprints.scala index 3bc468bcec5..b8a09b618fe 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/MutableMd5Fingerprints.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/MutableMd5Fingerprints.scala @@ -91,4 +91,9 @@ final class MutableMd5Fingerprints extends Md5Fingerprints { override def toString: String = s"Md5FingerprintProvider($fingerprints)" } -case class Fingerprint(text: String, md5: String) +case class Fingerprint(text: String, md5: String) { + def isEmpty: Boolean = md5.isEmpty() +} +object Fingerprint { + def empty: Fingerprint = Fingerprint("", "") +}