From 36c4b0a2b112cd2e39b0502720a5426d2cabd482 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Wed, 9 Nov 2022 14:54:57 +0100 Subject: [PATCH 1/6] NIT move Inputs into a separate package --- modules/build/src/main/scala/scala/build/Build.scala | 3 ++- modules/build/src/main/scala/scala/build/CrossSources.scala | 1 + modules/build/src/main/scala/scala/build/Sources.scala | 1 + .../build/src/main/scala/scala/build/bsp/BloopSession.scala | 3 ++- modules/build/src/main/scala/scala/build/bsp/Bsp.scala | 2 +- modules/build/src/main/scala/scala/build/bsp/BspImpl.scala | 1 + .../src/main/scala/scala/build/bsp/BuildServerProxy.scala | 3 ++- .../src/main/scala/scala/build/bsp/HasGeneratedSources.scala | 3 ++- .../main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala | 3 ++- .../src/main/scala/scala/build/{ => input}/Inputs.scala | 5 +++-- .../src/main/scala/scala/build/internal/MainClass.scala | 2 +- .../scala/build/internal/resource/NativeResourceMapper.scala | 3 ++- .../scala/scala/build/preprocessing/DataPreprocessor.scala | 3 ++- .../scala/scala/build/preprocessing/JavaPreprocessor.scala | 3 ++- .../scala/build/preprocessing/MarkdownPreprocessor.scala | 3 ++- .../main/scala/scala/build/preprocessing/Preprocessor.scala | 3 ++- .../scala/scala/build/preprocessing/ScalaPreprocessor.scala | 3 ++- .../scala/scala/build/preprocessing/ScriptPreprocessor.scala | 3 ++- .../src/test/scala/scala/build/tests/BuildProjectTests.scala | 3 ++- .../build/src/test/scala/scala/build/tests/InputsTests.scala | 2 +- .../test/scala/scala/build/tests/PreprocessingTests.scala | 2 +- .../build/src/test/scala/scala/build/tests/TestInputs.scala | 3 ++- modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala | 1 + .../cli/src/main/scala/scala/cli/commands/clean/Clean.scala | 3 ++- .../src/main/scala/scala/cli/commands/export/Export.scala | 1 + modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala | 3 ++- .../src/main/scala/scala/cli/commands/publish/Publish.scala | 1 + .../cli/src/main/scala/scala/cli/commands/repl/Repl.scala | 1 + modules/cli/src/main/scala/scala/cli/commands/run/Run.scala | 1 + .../main/scala/scala/cli/commands/setupide/SetupIde.scala | 3 ++- .../scala/scala/cli/commands/util/SharedOptionsUtil.scala | 3 ++- .../scala/scala/cli/errors/FoundVirtualInputsError.scala | 2 +- .../cli/src/main/scala/scala/cli/internal/CachedBinary.scala | 3 ++- 33 files changed, 54 insertions(+), 26 deletions(-) rename modules/build/src/main/scala/scala/build/{ => input}/Inputs.scala (99%) diff --git a/modules/build/src/main/scala/scala/build/Build.scala b/modules/build/src/main/scala/scala/build/Build.scala index a47a718daf..925a073a14 100644 --- a/modules/build/src/main/scala/scala/build/Build.scala +++ b/modules/build/src/main/scala/scala/build/Build.scala @@ -11,11 +11,12 @@ import java.util.concurrent.{ScheduledExecutorService, ScheduledFuture} import scala.annotation.tailrec import scala.build.EitherCps.{either, value} -import scala.build.Inputs.VirtualScript.VirtualScriptNameRegex import scala.build.Ops.* import scala.build.actionable.ActionablePreprocessor import scala.build.compiler.{ScalaCompiler, ScalaCompilerMaker} import scala.build.errors.* +import scala.build.input.Inputs +import scala.build.input.Inputs.VirtualScript.VirtualScriptNameRegex import scala.build.internal.resource.ResourceMapper import scala.build.internal.{Constants, CustomCodeWrapper, MainClass, Util} import scala.build.options.ScalaVersionUtil.asVersion diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index b8514531ab..96edb1036d 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -4,6 +4,7 @@ import scala.build.EitherCps.{either, value} import scala.build.Ops.* import scala.build.Positioned import scala.build.errors.{BuildException, CompositeBuildException, MalformedDirectiveError} +import scala.build.input.Inputs import scala.build.options.{ BuildOptions, BuildRequirements, diff --git a/modules/build/src/main/scala/scala/build/Sources.scala b/modules/build/src/main/scala/scala/build/Sources.scala index b5dcd0a2ff..ef6dfa3212 100644 --- a/modules/build/src/main/scala/scala/build/Sources.scala +++ b/modules/build/src/main/scala/scala/build/Sources.scala @@ -3,6 +3,7 @@ package scala.build import coursier.cache.ArchiveCache import coursier.util.Task +import scala.build.input.Inputs import scala.build.internal.CodeWrapper import scala.build.options.{BuildOptions, Scope} import scala.build.preprocessing.* diff --git a/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala b/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala index c9afb7ed2b..a5c5f8c27c 100644 --- a/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala +++ b/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala @@ -4,8 +4,9 @@ import com.swoval.files.PathWatchers import java.util.concurrent.atomic.AtomicReference +import scala.build.Build import scala.build.compiler.BloopCompiler -import scala.build.{Build, Inputs} +import scala.build.input.Inputs final class BloopSession( val inputs: Inputs, diff --git a/modules/build/src/main/scala/scala/build/bsp/Bsp.scala b/modules/build/src/main/scala/scala/build/bsp/Bsp.scala index 9d9e20fa90..d9b2bb5f2d 100644 --- a/modules/build/src/main/scala/scala/build/bsp/Bsp.scala +++ b/modules/build/src/main/scala/scala/build/bsp/Bsp.scala @@ -2,8 +2,8 @@ package scala.build.bsp import java.io.{InputStream, OutputStream} -import scala.build.Inputs import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.concurrent.Future trait Bsp { diff --git a/modules/build/src/main/scala/scala/build/bsp/BspImpl.scala b/modules/build/src/main/scala/scala/build/bsp/BspImpl.scala index 71a7314b50..cddf4b47c4 100644 --- a/modules/build/src/main/scala/scala/build/bsp/BspImpl.scala +++ b/modules/build/src/main/scala/scala/build/bsp/BspImpl.scala @@ -15,6 +15,7 @@ import scala.build.actionable.ActionablePreprocessor import scala.build.bloop.BloopServer import scala.build.compiler.BloopCompiler import scala.build.errors.{BuildException, Diagnostic, ParsingInputsException} +import scala.build.input.Inputs import scala.build.internal.{Constants, CustomCodeWrapper} import scala.build.options.{BuildOptions, Scope} import scala.collection.mutable.ListBuffer diff --git a/modules/build/src/main/scala/scala/build/bsp/BuildServerProxy.scala b/modules/build/src/main/scala/scala/build/bsp/BuildServerProxy.scala index 68bec9edb3..3e2b508049 100644 --- a/modules/build/src/main/scala/scala/build/bsp/BuildServerProxy.scala +++ b/modules/build/src/main/scala/scala/build/bsp/BuildServerProxy.scala @@ -4,8 +4,9 @@ import ch.epfl.scala.{bsp4j => b} import java.util.concurrent.CompletableFuture +import scala.build.GeneratedSource +import scala.build.input.Inputs import scala.build.options.Scope -import scala.build.{GeneratedSource, Inputs} class BuildServerProxy( bspServer: () => BspServer, diff --git a/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala b/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala index 53f2ce2c23..7706383c10 100644 --- a/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala +++ b/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSources.scala @@ -2,9 +2,10 @@ package scala.build.bsp import ch.epfl.scala.{bsp4j => b} +import scala.build.GeneratedSource +import scala.build.input.Inputs import scala.build.internal.Constants import scala.build.options.Scope -import scala.build.{GeneratedSource, Inputs} trait HasGeneratedSources { def targetIds: List[b.BuildTargetIdentifier] diff --git a/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala b/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala index f0e502e2f9..4855cbf824 100644 --- a/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala +++ b/modules/build/src/main/scala/scala/build/bsp/HasGeneratedSourcesImpl.scala @@ -2,9 +2,10 @@ package scala.build.bsp import ch.epfl.scala.{bsp4j => b} +import scala.build.GeneratedSource +import scala.build.input.Inputs import scala.build.internal.Constants import scala.build.options.Scope -import scala.build.{GeneratedSource, Inputs} import scala.collection.mutable trait HasGeneratedSourcesImpl extends HasGeneratedSources { diff --git a/modules/build/src/main/scala/scala/build/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala similarity index 99% rename from modules/build/src/main/scala/scala/build/Inputs.scala rename to modules/build/src/main/scala/scala/build/input/Inputs.scala index 42ac7a3863..3e7b664e19 100644 --- a/modules/build/src/main/scala/scala/build/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -1,4 +1,4 @@ -package scala.build +package scala.build.input import java.io.ByteArrayInputStream import java.math.BigInteger @@ -6,8 +6,9 @@ import java.nio.charset.StandardCharsets import java.security.MessageDigest import scala.annotation.tailrec -import scala.build.Inputs.{Element, WorkspaceOrigin} +import scala.build.Directories import scala.build.errors.{BuildException, InputsException} +import scala.build.input.Inputs.{Element, WorkspaceOrigin} import scala.build.internal.Constants import scala.build.internal.zip.WrappedZipInputStream import scala.build.options.Scope diff --git a/modules/build/src/main/scala/scala/build/internal/MainClass.scala b/modules/build/src/main/scala/scala/build/internal/MainClass.scala index ac1ec13f06..47d648aa56 100644 --- a/modules/build/src/main/scala/scala/build/internal/MainClass.scala +++ b/modules/build/src/main/scala/scala/build/internal/MainClass.scala @@ -6,7 +6,7 @@ import org.objectweb.asm.ClassReader import java.io.{ByteArrayInputStream, InputStream} import java.util.zip.ZipEntry -import scala.build.Inputs.{Element, resolve} +import scala.build.input.Inputs.{Element, resolve} import scala.build.internal.zip.WrappedZipInputStream object MainClass { diff --git a/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala b/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala index 64627d073a..86a8c539dd 100644 --- a/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala +++ b/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala @@ -1,6 +1,7 @@ package scala.build.internal.resource -import scala.build.{Build, Inputs} +import scala.build.Build +import scala.build.input.Inputs object NativeResourceMapper { diff --git a/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala index f378d68fb2..dba152fdef 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala @@ -2,8 +2,9 @@ package scala.build.preprocessing import java.nio.charset.StandardCharsets +import scala.build.Logger import scala.build.errors.BuildException -import scala.build.{Inputs, Logger} +import scala.build.input.Inputs case object DataPreprocessor extends Preprocessor { def preprocess( diff --git a/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala index 6df7a7392e..ef4398eb66 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala @@ -7,12 +7,13 @@ import coursier.util.Task import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} +import scala.build.Logger import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.JavaParserProxyMaker import scala.build.options.BuildRequirements import scala.build.preprocessing.ExtractedDirectives.from import scala.build.preprocessing.ScalaPreprocessor._ -import scala.build.{Inputs, Logger} /** Java source preprocessor. * diff --git a/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala index 912d0d5ec5..73adbbf1c7 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala @@ -3,12 +3,13 @@ package scala.build.preprocessing import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} +import scala.build.Logger import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.markdown.MarkdownCodeWrapper import scala.build.internal.{AmmUtil, CodeWrapper, CustomCodeWrapper, Name} import scala.build.options.{BuildOptions, BuildRequirements} import scala.build.preprocessing.ScalaPreprocessor.ProcessingOutput -import scala.build.{Inputs, Logger} case object MarkdownPreprocessor extends Preprocessor { def preprocess( diff --git a/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala index e9ae7d95be..be332a39e7 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala @@ -1,7 +1,8 @@ package scala.build.preprocessing +import scala.build.Logger import scala.build.errors.BuildException -import scala.build.{Inputs, Logger} +import scala.build.input.Inputs trait Preprocessor { def preprocess( diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala index b242838fd1..0734a498c6 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala @@ -9,10 +9,11 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.Ops.* import scala.build.errors.* +import scala.build.input.Inputs import scala.build.internal.Util import scala.build.options.{BuildOptions, BuildRequirements, ClassPathOptions, ShadowingSeq} import scala.build.preprocessing.directives.* -import scala.build.{Inputs, Logger, Position, Positioned} +import scala.build.{Logger, Position, Positioned} case object ScalaPreprocessor extends Preprocessor { diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala index 9a66ba38e9..1fff9a73ac 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala @@ -3,11 +3,12 @@ package scala.build.preprocessing import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} +import scala.build.Logger import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.{AmmUtil, CodeWrapper, CustomCodeWrapper, Name} import scala.build.options.{BuildOptions, BuildRequirements} import scala.build.preprocessing.ScalaPreprocessor.ProcessingOutput -import scala.build.{Inputs, Logger} final case class ScriptPreprocessor(codeWrapper: CodeWrapper) extends Preprocessor { def preprocess( diff --git a/modules/build/src/test/scala/scala/build/tests/BuildProjectTests.scala b/modules/build/src/test/scala/scala/build/tests/BuildProjectTests.scala index 4f3284a4a5..c36cd3bbc9 100644 --- a/modules/build/src/test/scala/scala/build/tests/BuildProjectTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/BuildProjectTests.scala @@ -9,6 +9,7 @@ import java.io.PrintStream import scala.build.Ops._ import scala.build.blooprifle.BloopRifleLogger import scala.build.errors.{BuildException, Diagnostic, Severity} +import scala.build.input.Inputs import scala.build.options.{ BuildOptions, InternalOptions, @@ -18,7 +19,7 @@ import scala.build.options.{ Scope, ShadowingSeq } -import scala.build.{Build, Inputs, LocalRepo, Logger, Position, Positioned, Sources} +import scala.build.{Build, LocalRepo, Logger, Position, Positioned, Sources} class BuildProjectTests extends munit.FunSuite { diff --git a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala index ed30ee528a..e66fb68c11 100644 --- a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala @@ -2,7 +2,7 @@ package scala.build.tests import com.eed3si9n.expecty.Expecty.expect import scala.build.Build -import scala.build.Inputs +import scala.build.input.Inputs import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion} import scala.build.tests.util.BloopServer import scala.build.{BuildThreads, Directories, LocalRepo} diff --git a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala index 8b80e92954..396af84e16 100644 --- a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala @@ -1,8 +1,8 @@ package scala.build.tests -import scala.build.Inputs import scala.build.preprocessing.{ScalaPreprocessor, ScriptPreprocessor, MarkdownPreprocessor} import com.eed3si9n.expecty.Expecty.expect +import scala.build.input.Inputs import scala.build.internal.CustomCodeWrapper diff --git a/modules/build/src/test/scala/scala/build/tests/TestInputs.scala b/modules/build/src/test/scala/scala/build/tests/TestInputs.scala index b9f73a1134..6bfeb4fae3 100644 --- a/modules/build/src/test/scala/scala/build/tests/TestInputs.scala +++ b/modules/build/src/test/scala/scala/build/tests/TestInputs.scala @@ -2,9 +2,10 @@ package scala.build.tests import java.nio.charset.StandardCharsets import scala.build.blooprifle.BloopRifleConfig -import scala.build.{Build, BuildThreads, Directories, Inputs} +import scala.build.{Build, BuildThreads, Directories} import scala.build.compiler.{BloopCompilerMaker, SimpleScalaCompilerMaker} import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.Util import scala.build.options.BuildOptions import scala.util.control.NonFatal diff --git a/modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala b/modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala index c3009b6dcc..cbc6538327 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/bsp/Bsp.scala @@ -7,6 +7,7 @@ import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.bsp.{BspReloadableOptions, BspThreads} import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.CustomCodeWrapper import scala.build.options.BuildOptions import scala.cli.CurrentParams diff --git a/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala b/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala index 76f7d08ae6..796dd9e88c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala @@ -2,8 +2,9 @@ package scala.cli.commands.clean import caseapp.* +import scala.build.input.Inputs import scala.build.internal.Constants -import scala.build.{Inputs, Logger, Os} +import scala.build.{Logger, Os} import scala.cli.commands.setupide.SetupIde import scala.cli.commands.util.CommonOps.* import scala.cli.commands.{CleanOptions, ScalaCommand} diff --git a/modules/cli/src/main/scala/scala/cli/commands/export/Export.scala b/modules/cli/src/main/scala/scala/cli/commands/export/Export.scala index 2e0cdd6a71..e59c87ba9c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/export/Export.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/export/Export.scala @@ -7,6 +7,7 @@ import coursier.util.{Artifact, Task} import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.{Constants, CustomCodeWrapper} import scala.build.options.{BuildOptions, Scope} import scala.cli.CurrentParams diff --git a/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala b/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala index 18656c90b8..c3ae65a80f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala @@ -3,9 +3,10 @@ package scala.cli.commands.fmt import caseapp.* import dependency.* +import scala.build.input.Inputs import scala.build.internal.{Constants, ExternalBinaryParams, FetchExternalBinary, Runner} import scala.build.options.BuildOptions -import scala.build.{Inputs, Logger, Sources} +import scala.build.{Logger, Sources} import scala.cli.CurrentParams import scala.cli.commands.util.FmtOptionsUtil.* import scala.cli.commands.util.FmtUtil.* diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala index 61f2a588d7..b2ee175447 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala @@ -27,6 +27,7 @@ import scala.build.Ops.* import scala.build.* import scala.build.compiler.ScalaCompilerMaker import scala.build.errors.{BuildException, CompositeBuildException, NoMainClassFoundError, Severity} +import scala.build.input.Inputs import scala.build.internal.Util import scala.build.internal.Util.ScalaDependencyOps import scala.build.options.publish.{ComputeVersion, Developer, License, Signer => PSigner, Vcs} diff --git a/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala b/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala index 760245bd87..584371e82d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala @@ -9,6 +9,7 @@ import dependency.* import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.errors.{BuildException, CantDownloadAmmoniteError, FetchingDependenciesError} +import scala.build.input.Inputs import scala.build.internal.{Constants, Runner} import scala.build.options.{BuildOptions, JavaOpt, MaybeScalaVersion, Scope} import scala.cli.CurrentParams diff --git a/modules/cli/src/main/scala/scala/cli/commands/run/Run.scala b/modules/cli/src/main/scala/scala/cli/commands/run/Run.scala index ddba75e805..6f20e229ed 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/run/Run.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/run/Run.scala @@ -9,6 +9,7 @@ import java.util.concurrent.CompletableFuture import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.errors.BuildException +import scala.build.input.Inputs import scala.build.internal.{Constants, Runner, ScalaJsLinkerConfig} import scala.build.options.{BuildOptions, JavaOpt, Platform, ScalacOpt} import scala.cli.CurrentParams diff --git a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala index 4d68b394d8..a5ebe4b07e 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala @@ -8,10 +8,11 @@ import com.google.gson.GsonBuilder import java.nio.charset.Charset import scala.build.EitherCps.{either, value} -import scala.build.Inputs.WorkspaceOrigin import scala.build.* import scala.build.bsp.IdeInputs import scala.build.errors.{BuildException, WorkspaceError} +import scala.build.input.Inputs +import scala.build.input.Inputs.WorkspaceOrigin import scala.build.internal.{Constants, CustomCodeWrapper} import scala.build.options.{BuildOptions, Scope} import scala.cli.CurrentParams diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala index eedf84f961..947e83bc35 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala @@ -15,6 +15,7 @@ import scala.build.* import scala.build.blooprifle.BloopRifleConfig import scala.build.compiler.{BloopCompilerMaker, ScalaCompilerMaker, SimpleScalaCompilerMaker} import scala.build.errors.{AmbiguousPlatformError, BuildException} +import scala.build.input.Inputs import scala.build.interactive.Interactive import scala.build.interactive.Interactive.{InteractiveAsk, InteractiveNop} import scala.build.internal.CsLoggerUtil.* @@ -23,7 +24,7 @@ import scala.build.options.ScalaVersionUtil.fileWithTtl0 import scala.build.options.{Platform, ScalacOpt, ShadowingSeq} import scala.build.options as bo import scala.cli.commands.ScalaJsOptions -import scala.cli.commands.publish.ConfigUtil._ +import scala.cli.commands.publish.ConfigUtil.* import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.ScalacOptionsUtil.* import scala.cli.commands.util.SharedCompilationServerOptionsUtil.* diff --git a/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala b/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala index 7340beb8c1..1f854aae2e 100644 --- a/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala +++ b/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala @@ -1,7 +1,7 @@ package scala.cli.errors -import scala.build.Inputs import scala.build.errors.BuildException +import scala.build.input.Inputs final class FoundVirtualInputsError( val virtualInputs: Seq[Inputs.Virtual] diff --git a/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala b/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala index 3e0036cc3d..ed86ea7d8f 100644 --- a/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala +++ b/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala @@ -4,8 +4,9 @@ import java.math.BigInteger import java.nio.charset.StandardCharsets import java.security.MessageDigest +import scala.build.Build +import scala.build.input.Inputs import scala.build.internal.Constants -import scala.build.{Build, Inputs} object CachedBinary { From 390339e3d172bd2f85877ab59ad6527aafe1af18 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Wed, 9 Nov 2022 15:03:48 +0100 Subject: [PATCH 2/6] Extract Inputs.WorkspaceOrigin to a separate source file --- .../src/main/scala/scala/build/input/Inputs.scala | 12 +----------- .../scala/scala/build/input/WorkspaceOrigin.scala | 13 +++++++++++++ .../scala/cli/commands/setupide/SetupIde.scala | 3 +-- 3 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 modules/build/src/main/scala/scala/build/input/WorkspaceOrigin.scala diff --git a/modules/build/src/main/scala/scala/build/input/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala index 3e7b664e19..cb4587e348 100644 --- a/modules/build/src/main/scala/scala/build/input/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -8,7 +8,7 @@ import java.security.MessageDigest import scala.annotation.tailrec import scala.build.Directories import scala.build.errors.{BuildException, InputsException} -import scala.build.input.Inputs.{Element, WorkspaceOrigin} +import scala.build.input.Inputs.Element import scala.build.internal.Constants import scala.build.internal.zip.WrappedZipInputStream import scala.build.options.Scope @@ -136,16 +136,6 @@ final case class Inputs( } object Inputs { - - sealed abstract class WorkspaceOrigin extends Product with Serializable - - object WorkspaceOrigin { - case object Forced extends WorkspaceOrigin - case object SourcePaths extends WorkspaceOrigin - case object ResourcePaths extends WorkspaceOrigin - case object HomeDir extends WorkspaceOrigin - } - sealed abstract class Element extends Product with Serializable sealed trait SingleElement extends Element diff --git a/modules/build/src/main/scala/scala/build/input/WorkspaceOrigin.scala b/modules/build/src/main/scala/scala/build/input/WorkspaceOrigin.scala new file mode 100644 index 0000000000..1604770c45 --- /dev/null +++ b/modules/build/src/main/scala/scala/build/input/WorkspaceOrigin.scala @@ -0,0 +1,13 @@ +package scala.build.input + +sealed abstract class WorkspaceOrigin extends Product with Serializable + +object WorkspaceOrigin { + case object Forced extends WorkspaceOrigin + + case object SourcePaths extends WorkspaceOrigin + + case object ResourcePaths extends WorkspaceOrigin + + case object HomeDir extends WorkspaceOrigin +} diff --git a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala index a5ebe4b07e..b9b8728802 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala @@ -11,8 +11,7 @@ import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.bsp.IdeInputs import scala.build.errors.{BuildException, WorkspaceError} -import scala.build.input.Inputs -import scala.build.input.Inputs.WorkspaceOrigin +import scala.build.input.{Inputs, WorkspaceOrigin} import scala.build.internal.{Constants, CustomCodeWrapper} import scala.build.options.{BuildOptions, Scope} import scala.cli.CurrentParams From d88df10ce8aa91b516a88feca48e73d8aa6d79a9 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Wed, 9 Nov 2022 15:44:57 +0100 Subject: [PATCH 3/6] Extract Inputs.Element to a separate source file --- .../src/main/scala/scala/build/Build.scala | 24 +-- .../main/scala/scala/build/CrossSources.scala | 20 +-- .../scala/scala/build/bsp/BloopSession.scala | 8 +- .../scala/scala/build/input/Element.scala | 107 +++++++++++ .../main/scala/scala/build/input/Inputs.scala | 169 +++++------------- .../scala/build/internal/MainClass.scala | 3 +- .../resource/NativeResourceMapper.scala | 4 +- .../preprocessing/DataPreprocessor.scala | 6 +- .../preprocessing/JavaPreprocessor.scala | 8 +- .../preprocessing/MarkdownPreprocessor.scala | 6 +- .../build/preprocessing/Preprocessor.scala | 4 +- .../preprocessing/ScalaPreprocessor.scala | 8 +- .../preprocessing/ScriptPreprocessor.scala | 8 +- .../build/tests/PreprocessingTests.scala | 8 +- .../scala/scala/cli/commands/fmt/Fmt.scala | 6 +- .../cli/commands/setupide/SetupIde.scala | 8 +- .../cli/commands/util/SharedOptionsUtil.scala | 6 +- .../cli/errors/FoundVirtualInputsError.scala | 4 +- .../scala/cli/internal/CachedBinary.scala | 6 +- 19 files changed, 219 insertions(+), 194 deletions(-) create mode 100644 modules/build/src/main/scala/scala/build/input/Element.scala diff --git a/modules/build/src/main/scala/scala/build/Build.scala b/modules/build/src/main/scala/scala/build/Build.scala index 925a073a14..350c6994c5 100644 --- a/modules/build/src/main/scala/scala/build/Build.scala +++ b/modules/build/src/main/scala/scala/build/Build.scala @@ -15,8 +15,8 @@ import scala.build.Ops.* import scala.build.actionable.ActionablePreprocessor import scala.build.compiler.{ScalaCompiler, ScalaCompilerMaker} import scala.build.errors.* -import scala.build.input.Inputs -import scala.build.input.Inputs.VirtualScript.VirtualScriptNameRegex +import scala.build.input.VirtualScript.VirtualScriptNameRegex +import scala.build.input.* import scala.build.internal.resource.ResourceMapper import scala.build.internal.{Constants, CustomCodeWrapper, MainClass, Util} import scala.build.options.ScalaVersionUtil.asVersion @@ -514,8 +514,8 @@ object Build { else if (scalaVersion.startsWith("2.12")) if ( inputs.sourceFiles().forall { - case _: Inputs.AnyScript => snNumeralVer >= SNNumeralVersion(0, 4, 3) - case _ => true + case _: AnyScript => snNumeralVer >= SNNumeralVersion(0, 4, 3) + case _ => true } ) Right(snNumeralVer) else snCompatError @@ -667,7 +667,7 @@ object Build { val watcher = new Watcher(ListBuffer(), threads.fileWatcher, run(), compiler.shutdown()) def doWatch(): Unit = { - val elements: Seq[Inputs.Element] = + val elements: Seq[Element] = if (res == null) inputs.elements else res.map { builds => @@ -677,11 +677,11 @@ object Build { }.getOrElse(inputs.elements) for (elem <- elements) { val depth = elem match { - case _: Inputs.SingleFile => -1 - case _ => Int.MaxValue + case _: SingleFile => -1 + case _ => Int.MaxValue } val eventFilter: PathWatchers.Event => Boolean = elem match { - case d: Inputs.Directory => + case d: Directory => // Filtering event for directories, to ignore those related to the .bloop directory in particular event => val p = os.Path(event.getTypedPath.getPath.toAbsolutePath) @@ -695,9 +695,9 @@ object Build { val watcher0 = watcher.newWatcher() elem match { - case d: Inputs.OnDisk => + case d: OnDisk => watcher0.register(d.path.toNIO, depth) - case _: Inputs.Virtual => + case _: Virtual => } watcher0.addObserver { onChangeBufferedObserver { event => @@ -1214,8 +1214,8 @@ object Build { // hash of the underlying project if needed is already in jmhProjectName mayAppendHash = false, elements = inputs.elements ++ Seq( - Inputs.Directory(jmhSourceDir), - Inputs.ResourceDirectory(jmhResourceDir) + Directory(jmhSourceDir), + ResourceDirectory(jmhResourceDir) ) ) val updatedOptions = build.options.copy( diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index 96edb1036d..5fd9c5f930 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -4,7 +4,7 @@ import scala.build.EitherCps.{either, value} import scala.build.Ops.* import scala.build.Positioned import scala.build.errors.{BuildException, CompositeBuildException, MalformedDirectiveError} -import scala.build.input.Inputs +import scala.build.input.* import scala.build.options.{ BuildOptions, BuildRequirements, @@ -109,7 +109,7 @@ object CrossSources { p.root.exists { path => val fullPath = path / p.path inputs.elements.exists { - case Inputs.Directory(path) => + case Directory(path) => // Is this file subdirectory of given dir and if we have a subdiretory 'test' on the way fullPath.startsWith(path) && fullPath.relativeTo(path).segments.contains("test") @@ -127,7 +127,7 @@ object CrossSources { maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e) ): Either[BuildException, (CrossSources, Inputs)] = either { - def preprocessSources(elems: Seq[Inputs.SingleElement]) + def preprocessSources(elems: Seq[SingleElement]) : Either[BuildException, Seq[PreprocessedSource]] = elems .map { elem => @@ -221,7 +221,7 @@ object CrossSources { } val resourceDirs = allInputs.elements.collect { - case r: Inputs.ResourceDirectory => + case r: ResourceDirectory => HasBuildRequirements(BuildRequirements(), r.path) } ++ preprocessedSources.flatMap(_.options).flatMap(_.classPathOptions.resourcesDir).map( HasBuildRequirements(BuildRequirements(), _) @@ -236,13 +236,13 @@ object CrossSources { lazy val dir = sourcePath / os.up lazy val subPath = sourcePath.subRelativeTo(dir) if (os.isDir(sourcePath)) - Right(Inputs.singleFilesFromDirectory(Inputs.Directory(sourcePath), enableMarkdown)) + Right(Inputs.singleFilesFromDirectory(Directory(sourcePath), enableMarkdown)) else if (sourcePath == os.sub / "project.scala") - Right(Seq(Inputs.ProjectScalaFile(dir, subPath))) - else if (sourcePath.ext == "scala") Right(Seq(Inputs.SourceScalaFile(dir, subPath))) - else if (sourcePath.ext == "sc") Right(Seq(Inputs.Script(dir, subPath))) - else if (sourcePath.ext == "java") Right(Seq(Inputs.JavaFile(dir, subPath))) - else if (sourcePath.ext == "md") Right(Seq(Inputs.MarkdownFile(dir, subPath))) + Right(Seq(ProjectScalaFile(dir, subPath))) + else if (sourcePath.ext == "scala") Right(Seq(SourceScalaFile(dir, subPath))) + else if (sourcePath.ext == "sc") Right(Seq(Script(dir, subPath))) + else if (sourcePath.ext == "java") Right(Seq(JavaFile(dir, subPath))) + else if (sourcePath.ext == "md") Right(Seq(MarkdownFile(dir, subPath))) else { val msg = if (os.exists(sourcePath)) diff --git a/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala b/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala index a5c5f8c27c..7db9944fe2 100644 --- a/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala +++ b/modules/build/src/main/scala/scala/build/bsp/BloopSession.scala @@ -6,7 +6,7 @@ import java.util.concurrent.atomic.AtomicReference import scala.build.Build import scala.build.compiler.BloopCompiler -import scala.build.input.Inputs +import scala.build.input.{Inputs, OnDisk, SingleFile, Virtual} final class BloopSession( val inputs: Inputs, @@ -17,9 +17,9 @@ final class BloopSession( def resetDiagnostics(localClient: BspClient): Unit = for (targetId <- bspServer.targetIds) inputs.flattened().foreach { - case f: Inputs.SingleFile => + case f: SingleFile => localClient.resetDiagnostics(f.path, targetId) - case _: Inputs.Virtual => + case _: Virtual => } def dispose(): Unit = { watcher.dispose() @@ -28,7 +28,7 @@ final class BloopSession( def registerWatchInputs(): Unit = inputs.elements.foreach { - case elem: Inputs.OnDisk => + case elem: OnDisk => val eventFilter: PathWatchers.Event => Boolean = { event => val newOrDeletedFile = event.getKind == PathWatchers.Event.Kind.Create || diff --git a/modules/build/src/main/scala/scala/build/input/Element.scala b/modules/build/src/main/scala/scala/build/input/Element.scala new file mode 100644 index 0000000000..30909596d4 --- /dev/null +++ b/modules/build/src/main/scala/scala/build/input/Element.scala @@ -0,0 +1,107 @@ +package scala.build.input + +import scala.build.preprocessing.ScopePath +import scala.util.matching.Regex + +sealed abstract class Element extends Product with Serializable + +sealed trait SingleElement extends Element + +sealed trait AnyScript extends Element + +sealed abstract class OnDisk extends Element { + def path: os.Path +} + +sealed abstract class Virtual extends SingleElement { + def content: Array[Byte] + + def source: String + + def subPath: os.SubPath = { + val idx = source.lastIndexOf('/') + os.sub / source.drop(idx + 1) + } + + def scopePath: ScopePath = + ScopePath(Left(source), subPath) +} + +sealed abstract class VirtualSourceFile extends Virtual { + def isStdin: Boolean = source.startsWith("") + + def isSnippet: Boolean = source.startsWith("") + + protected def generatedSourceFileName(fileSuffix: String): String = + if (isStdin) s"stdin$fileSuffix" + else if (isSnippet) s"${source.stripPrefix("-")}$fileSuffix" + else s"virtual$fileSuffix" +} + +sealed trait SingleFile extends OnDisk with SingleElement + +sealed trait SourceFile extends SingleFile { + def subPath: os.SubPath +} + +sealed trait Compiled extends Element + +sealed trait AnyScalaFile extends Compiled + +sealed trait ScalaFile extends AnyScalaFile { + def base: os.Path + + def subPath: os.SubPath + + def path: os.Path = base / subPath +} + +final case class Script(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile with AnyScalaFile with AnyScript { + lazy val path: os.Path = base / subPath +} + +final case class SourceScalaFile(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile with ScalaFile + +final case class ProjectScalaFile(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile with ScalaFile + +final case class JavaFile(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile with Compiled { + lazy val path: os.Path = base / subPath +} + +final case class CFile(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile with Compiled { + lazy val path = base / subPath +} + +final case class MarkdownFile(base: os.Path, subPath: os.SubPath) + extends OnDisk with SourceFile { + lazy val path: os.Path = base / subPath +} + +final case class Directory(path: os.Path) extends OnDisk with Compiled + +final case class ResourceDirectory(path: os.Path) extends OnDisk + +final case class VirtualScript(content: Array[Byte], source: String, wrapperPath: os.SubPath) + extends Virtual with AnyScalaFile with AnyScript + +object VirtualScript { + val VirtualScriptNameRegex: Regex = "(^stdin$|^snippet\\d*$)".r +} + +final case class VirtualScalaFile(content: Array[Byte], source: String) + extends VirtualSourceFile with AnyScalaFile { + def generatedSourceFileName: String = generatedSourceFileName(".scala") +} + +final case class VirtualJavaFile(content: Array[Byte], source: String) + extends VirtualSourceFile with Compiled { + def generatedSourceFileName: String = generatedSourceFileName(".java") +} + +final case class VirtualData(content: Array[Byte], source: String) + extends Virtual diff --git a/modules/build/src/main/scala/scala/build/input/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala index cb4587e348..8495665bd1 100644 --- a/modules/build/src/main/scala/scala/build/input/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -8,7 +8,6 @@ import java.security.MessageDigest import scala.annotation.tailrec import scala.build.Directories import scala.build.errors.{BuildException, InputsException} -import scala.build.input.Inputs.Element import scala.build.internal.Constants import scala.build.internal.zip.WrappedZipInputStream import scala.build.options.Scope @@ -17,8 +16,8 @@ import scala.util.Properties import scala.util.matching.Regex final case class Inputs( - elements: Seq[Inputs.Element], - defaultMainClassElement: Option[Inputs.Script], + elements: Seq[Element], + defaultMainClassElement: Option[Script], workspace: os.Path, baseProjectName: String, mayAppendHash: Boolean, @@ -30,41 +29,41 @@ final case class Inputs( def isEmpty: Boolean = elements.isEmpty - def singleFiles(): Seq[Inputs.SingleFile] = + def singleFiles(): Seq[SingleFile] = elements.flatMap { - case f: Inputs.SingleFile => Seq(f) - case d: Inputs.Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) - case _: Inputs.ResourceDirectory => Nil - case _: Inputs.Virtual => Nil + case f: SingleFile => Seq(f) + case d: Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) + case _: ResourceDirectory => Nil + case _: Virtual => Nil } - def sourceFiles(): Seq[Inputs.SourceFile] = + def sourceFiles(): Seq[SourceFile] = singleFiles().collect { - case f: Inputs.SourceFile => f + case f: SourceFile => f } - def virtualSourceFiles(): Seq[Inputs.Virtual] = + def virtualSourceFiles(): Seq[Virtual] = elements.flatMap { - case v: Inputs.Virtual => + case v: Virtual => Seq(v) case _ => Nil } - def flattened(): Seq[Inputs.SingleElement] = + def flattened(): Seq[SingleElement] = elements.flatMap { - case f: Inputs.SingleFile => Seq(f) - case d: Inputs.Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) - case _: Inputs.ResourceDirectory => Nil - case v: Inputs.Virtual => Seq(v) + case f: SingleFile => Seq(f) + case d: Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) + case _: ResourceDirectory => Nil + case v: Virtual => Seq(v) } private lazy val inputsHash: String = Inputs.inputsHash(elements) lazy val projectName: String = { val needsSuffix = mayAppendHash && (elements match { - case Seq(d: Inputs.Directory) => d.path != workspace - case _ => true + case Seq(d: Directory) => d.path != workspace + case _ => true }) if (needsSuffix) baseProjectName + "-" + inputsHash else baseProjectName @@ -74,7 +73,7 @@ final case class Inputs( if (scope == Scope.Main) projectName else projectName + "-" + scope.name - def add(extraElements: Seq[Inputs.Element]): Inputs = + def add(extraElements: Seq[Element]): Inputs = if (elements.isEmpty) this else copy(elements = (elements ++ extraElements).distinct) @@ -109,15 +108,15 @@ final case class Inputs( def sourceHash(): String = { def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) val it = elements.iterator.flatMap { - case elem: Inputs.OnDisk => + case elem: OnDisk => val content = elem match { - case dirInput: Inputs.Directory => + case dirInput: Directory => Seq("dir:") ++ Inputs.singleFilesFromDirectory(dirInput, enableMarkdown) .map(file => s"${file.path}:" + os.read(file.path)) case _ => Seq(os.read(elem.path)) } (Iterator(elem.path.toString) ++ content.iterator ++ Iterator("\n")).map(bytes) - case v: Inputs.Virtual => + case v: Virtual => Iterator(v.content, bytes("\n")) } val md = MessageDigest.getInstance("SHA-1") @@ -136,141 +135,59 @@ final case class Inputs( } object Inputs { - sealed abstract class Element extends Product with Serializable - - sealed trait SingleElement extends Element - - sealed trait AnyScript extends Element - - sealed abstract class OnDisk extends Element { - def path: os.Path - } - sealed abstract class Virtual extends SingleElement { - def content: Array[Byte] - def source: String - - def subPath: os.SubPath = { - val idx = source.lastIndexOf('/') - os.sub / source.drop(idx + 1) - } - - def scopePath: ScopePath = - ScopePath(Left(source), subPath) - } - - sealed abstract class VirtualSourceFile extends Virtual { - def isStdin: Boolean = source.startsWith("") - def isSnippet: Boolean = source.startsWith("") - protected def generatedSourceFileName(fileSuffix: String): String = - if (isStdin) s"stdin$fileSuffix" - else if (isSnippet) s"${source.stripPrefix("-")}$fileSuffix" - else s"virtual$fileSuffix" - } - - sealed trait SingleFile extends OnDisk with SingleElement - sealed trait SourceFile extends SingleFile { - def subPath: os.SubPath - } - sealed trait Compiled extends Element - sealed trait AnyScalaFile extends Compiled - sealed trait ScalaFile extends AnyScalaFile { - def base: os.Path - def subPath: os.SubPath - def path: os.Path = base / subPath - } - - final case class Script(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile with AnyScalaFile with AnyScript { - lazy val path: os.Path = base / subPath - } - final case class SourceScalaFile(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile with ScalaFile - final case class ProjectScalaFile(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile with ScalaFile - final case class JavaFile(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile with Compiled { - lazy val path: os.Path = base / subPath - } - final case class CFile(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile with Compiled { - lazy val path = base / subPath - } - final case class MarkdownFile(base: os.Path, subPath: os.SubPath) - extends OnDisk with SourceFile { - lazy val path: os.Path = base / subPath - } - final case class Directory(path: os.Path) extends OnDisk with Compiled - final case class ResourceDirectory(path: os.Path) extends OnDisk - - final case class VirtualScript(content: Array[Byte], source: String, wrapperPath: os.SubPath) - extends Virtual with AnyScalaFile with AnyScript - object VirtualScript { - val VirtualScriptNameRegex: Regex = "(^stdin$|^snippet\\d*$)".r - } - final case class VirtualScalaFile(content: Array[Byte], source: String) - extends VirtualSourceFile with AnyScalaFile { - def generatedSourceFileName: String = generatedSourceFileName(".scala") - } - final case class VirtualJavaFile(content: Array[Byte], source: String) - extends VirtualSourceFile with Compiled { - def generatedSourceFileName: String = generatedSourceFileName(".java") - } - final case class VirtualData(content: Array[Byte], source: String) - extends Virtual - def singleFilesFromDirectory( - d: Inputs.Directory, + d: Directory, enableMarkdown: Boolean - ): Seq[Inputs.SingleFile] = { + ): Seq[SingleFile] = { import Ordering.Implicits.seqOrdering os.walk.stream(d.path, skip = _.last.startsWith(".")) .filter(os.isFile(_)) .collect { case p if p.last.endsWith(".java") => - Inputs.JavaFile(d.path, p.subRelativeTo(d.path)) + JavaFile(d.path, p.subRelativeTo(d.path)) case p if p.last == "project.scala" => - Inputs.ProjectScalaFile(d.path, p.subRelativeTo(d.path)) + ProjectScalaFile(d.path, p.subRelativeTo(d.path)) case p if p.last.endsWith(".scala") => - Inputs.SourceScalaFile(d.path, p.subRelativeTo(d.path)) + SourceScalaFile(d.path, p.subRelativeTo(d.path)) case p if p.last.endsWith(".sc") => - Inputs.Script(d.path, p.subRelativeTo(d.path)) + Script(d.path, p.subRelativeTo(d.path)) case p if p.last.endsWith(".c") || p.last.endsWith(".h") => - Inputs.CFile(d.path, p.subRelativeTo(d.path)) + CFile(d.path, p.subRelativeTo(d.path)) case p if p.last.endsWith(".md") && enableMarkdown => - Inputs.MarkdownFile(d.path, p.subRelativeTo(d.path)) + MarkdownFile(d.path, p.subRelativeTo(d.path)) } .toVector .sortBy(_.subPath.segments) } - def projectSettingsFiles(elements: Seq[Inputs.Element]): Seq[Inputs.ProjectScalaFile] = + def projectSettingsFiles(elements: Seq[Element]): Seq[ProjectScalaFile] = elements.flatMap { case f: ProjectScalaFile => Seq(f) case d: Directory => Inputs.configFileFromDirectory(d) case _ => Nil }.distinct - def configFileFromDirectory(d: Inputs.Directory): Seq[Inputs.ProjectScalaFile] = + def configFileFromDirectory(d: Directory): Seq[ProjectScalaFile] = if (os.exists(d.path / "project.scala")) - Seq(Inputs.ProjectScalaFile(d.path, os.sub / "project.scala")) + Seq(ProjectScalaFile(d.path, os.sub / "project.scala")) else Nil private def inputsHash(elements: Seq[Element]): String = { def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) val it = elements.iterator.flatMap { - case elem: Inputs.OnDisk => + case elem: OnDisk => val prefix = elem match { - case _: Inputs.Directory => "dir:" - case _: Inputs.ResourceDirectory => "resource-dir:" - case _: Inputs.JavaFile => "java:" - case _: Inputs.ProjectScalaFile => "config:" - case _: Inputs.SourceScalaFile => "scala:" - case _: Inputs.CFile => "c:" - case _: Inputs.Script => "sc:" - case _: Inputs.MarkdownFile => "md:" + case _: Directory => "dir:" + case _: ResourceDirectory => "resource-dir:" + case _: JavaFile => "java:" + case _: ProjectScalaFile => "config:" + case _: SourceScalaFile => "scala:" + case _: CFile => "c:" + case _: Script => "sc:" + case _: MarkdownFile => "md:" } Iterator(prefix, elem.path.toString, "\n").map(bytes) - case v: Inputs.Virtual => + case v: Virtual => Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n")) } val md = MessageDigest.getInstance("SHA-1") diff --git a/modules/build/src/main/scala/scala/build/internal/MainClass.scala b/modules/build/src/main/scala/scala/build/internal/MainClass.scala index 47d648aa56..90d425b4b2 100644 --- a/modules/build/src/main/scala/scala/build/internal/MainClass.scala +++ b/modules/build/src/main/scala/scala/build/internal/MainClass.scala @@ -6,7 +6,8 @@ import org.objectweb.asm.ClassReader import java.io.{ByteArrayInputStream, InputStream} import java.util.zip.ZipEntry -import scala.build.input.Inputs.{Element, resolve} +import scala.build.input.Element +import scala.build.input.Inputs.resolve import scala.build.internal.zip.WrappedZipInputStream object MainClass { diff --git a/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala b/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala index 86a8c539dd..31037dd3af 100644 --- a/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala +++ b/modules/build/src/main/scala/scala/build/internal/resource/NativeResourceMapper.scala @@ -1,7 +1,7 @@ package scala.build.internal.resource import scala.build.Build -import scala.build.input.Inputs +import scala.build.input.{CFile, Inputs} object NativeResourceMapper { @@ -10,7 +10,7 @@ object NativeResourceMapper { .inputs .flattened() .collect { - case cfile: Inputs.CFile => + case cfile: CFile => val inputPath = cfile.path val destPath = os.rel / "scala-native" / cfile.subPath (inputPath, destPath) diff --git a/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala index dba152fdef..9cafcaeb18 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/DataPreprocessor.scala @@ -4,17 +4,17 @@ import java.nio.charset.StandardCharsets import scala.build.Logger import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, SingleElement, VirtualData} case object DataPreprocessor extends Preprocessor { def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e), allowRestrictedFeatures: Boolean ): Option[Either[BuildException, Seq[PreprocessedSource]]] = input match { - case file: Inputs.VirtualData => + case file: VirtualData => val content = new String(file.content, StandardCharsets.UTF_8) val inMemory = Seq( diff --git a/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala index ef4398eb66..721421ea27 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala @@ -9,7 +9,7 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.Logger import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, JavaFile, SingleElement, VirtualJavaFile} import scala.build.internal.JavaParserProxyMaker import scala.build.options.BuildRequirements import scala.build.preprocessing.ExtractedDirectives.from @@ -33,13 +33,13 @@ final case class JavaPreprocessor( javaCommand: () => String ) extends Preprocessor { def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e), allowRestrictedFeatures: Boolean ): Option[Either[BuildException, Seq[PreprocessedSource]]] = input match { - case j: Inputs.JavaFile => Some(either { + case j: JavaFile => Some(either { val content = value(PreprocessingUtil.maybeRead(j.path)) val scopePath = ScopePath.fromPath(j.path) val ExtractedDirectives(_, directives0) = @@ -67,7 +67,7 @@ final case class JavaPreprocessor( None )) }) - case v: Inputs.VirtualJavaFile => + case v: VirtualJavaFile => val res = either { val relPath = if (v.isStdin || v.isSnippet) { diff --git a/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala index 73adbbf1c7..0180106f27 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/MarkdownPreprocessor.scala @@ -5,7 +5,7 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.Logger import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, MarkdownFile, SingleElement} import scala.build.internal.markdown.MarkdownCodeWrapper import scala.build.internal.{AmmUtil, CodeWrapper, CustomCodeWrapper, Name} import scala.build.options.{BuildOptions, BuildRequirements} @@ -13,13 +13,13 @@ import scala.build.preprocessing.ScalaPreprocessor.ProcessingOutput case object MarkdownPreprocessor extends Preprocessor { def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException], allowRestrictedFeatures: Boolean ): Option[Either[BuildException, Seq[PreprocessedSource]]] = input match { - case markdown: Inputs.MarkdownFile => + case markdown: MarkdownFile => val res = either { val content = value(PreprocessingUtil.maybeRead(markdown.path)) val preprocessed = value { diff --git a/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala index be332a39e7..ccaf20e8b1 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/Preprocessor.scala @@ -2,11 +2,11 @@ package scala.build.preprocessing import scala.build.Logger import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, SingleElement} trait Preprocessor { def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e), allowRestrictedFeatures: Boolean diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala index 0734a498c6..78904665c5 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala @@ -9,7 +9,7 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.Ops.* import scala.build.errors.* -import scala.build.input.Inputs +import scala.build.input.{Inputs, ScalaFile, SingleElement, VirtualScalaFile} import scala.build.internal.Util import scala.build.options.{BuildOptions, BuildRequirements, ClassPathOptions, ShadowingSeq} import scala.build.preprocessing.directives.* @@ -74,13 +74,13 @@ case object ScalaPreprocessor extends Preprocessor { ) def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e), allowRestrictedFeatures: Boolean ): Option[Either[BuildException, Seq[PreprocessedSource]]] = input match { - case f: Inputs.ScalaFile => + case f: ScalaFile => val res = either { val content = value(PreprocessingUtil.maybeRead(f.path)) val scopePath = ScopePath.fromPath(f.path) @@ -127,7 +127,7 @@ case object ScalaPreprocessor extends Preprocessor { } Some(res) - case v: Inputs.VirtualScalaFile => + case v: VirtualScalaFile => val res = either { val relPath = v match { case v if !v.isStdin && !v.isSnippet => v.subPath diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala index 1fff9a73ac..5396926fd3 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala @@ -5,20 +5,20 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.Logger import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, Script, SingleElement, VirtualScript} import scala.build.internal.{AmmUtil, CodeWrapper, CustomCodeWrapper, Name} import scala.build.options.{BuildOptions, BuildRequirements} import scala.build.preprocessing.ScalaPreprocessor.ProcessingOutput final case class ScriptPreprocessor(codeWrapper: CodeWrapper) extends Preprocessor { def preprocess( - input: Inputs.SingleElement, + input: SingleElement, logger: Logger, maybeRecoverOnError: BuildException => Option[BuildException] = e => Some(e), allowRestrictedFeatures: Boolean ): Option[Either[BuildException, Seq[PreprocessedSource]]] = input match { - case script: Inputs.Script => + case script: Script => val res = either { val content = value(PreprocessingUtil.maybeRead(script.path)) val preprocessed = value { @@ -37,7 +37,7 @@ final case class ScriptPreprocessor(codeWrapper: CodeWrapper) extends Preprocess } Some(res) - case script: Inputs.VirtualScript => + case script: VirtualScript => val content = new String(script.content, StandardCharsets.UTF_8) val res = either { diff --git a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala index 396af84e16..d64aece553 100644 --- a/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/PreprocessingTests.scala @@ -2,7 +2,7 @@ package scala.build.tests import scala.build.preprocessing.{ScalaPreprocessor, ScriptPreprocessor, MarkdownPreprocessor} import com.eed3si9n.expecty.Expecty.expect -import scala.build.input.Inputs +import scala.build.input.{Inputs, SourceScalaFile, MarkdownFile, Script} import scala.build.internal.CustomCodeWrapper @@ -10,7 +10,7 @@ class PreprocessingTests extends munit.FunSuite { test("Report error if scala file not exists") { val logger = TestLogger() - val scalaFile = Inputs.SourceScalaFile(os.temp.dir(), os.SubPath("NotExists.scala")) + val scalaFile = SourceScalaFile(os.temp.dir(), os.SubPath("NotExists.scala")) val res = ScalaPreprocessor.preprocess(scalaFile, logger, allowRestrictedFeatures = false) val expectedMessage = s"File not found: ${scalaFile.path}" @@ -22,7 +22,7 @@ class PreprocessingTests extends munit.FunSuite { test("Report error if scala script not exists") { val logger = TestLogger() - val scalaScript = Inputs.Script(os.temp.dir(), os.SubPath("NotExists.sc")) + val scalaScript = Script(os.temp.dir(), os.SubPath("NotExists.sc")) val res = ScriptPreprocessor(CustomCodeWrapper).preprocess( scalaScript, @@ -38,7 +38,7 @@ class PreprocessingTests extends munit.FunSuite { test("Report error if markdown does not exist") { val logger = TestLogger() - val markdownFile = Inputs.MarkdownFile(os.temp.dir(), os.SubPath("NotExists.md")) + val markdownFile = MarkdownFile(os.temp.dir(), os.SubPath("NotExists.md")) val res = MarkdownPreprocessor.preprocess(markdownFile, logger, allowRestrictedFeatures = false) val expectedMessage = s"File not found: ${markdownFile.path}" diff --git a/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala b/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala index c3ae65a80f..21fd3e87e8 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/fmt/Fmt.scala @@ -3,7 +3,7 @@ package scala.cli.commands.fmt import caseapp.* import dependency.* -import scala.build.input.Inputs +import scala.build.input.{Inputs, Script, SourceScalaFile} import scala.build.internal.{Constants, ExternalBinaryParams, FetchExternalBinary, Runner} import scala.build.options.BuildOptions import scala.build.{Logger, Sources} @@ -34,8 +34,8 @@ object Fmt extends ScalaCommand[FmtOptions] { else { val i = options.shared.inputs(args.all).orExit(logger) val s = i.sourceFiles().collect { - case sc: Inputs.Script => sc.path - case sc: Inputs.SourceScalaFile => sc.path + case sc: Script => sc.path + case sc: SourceScalaFile => sc.path } (s, i.workspace, Some(i)) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala index b9b8728802..d1d6354c48 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/setupide/SetupIde.scala @@ -11,7 +11,7 @@ import scala.build.EitherCps.{either, value} import scala.build.* import scala.build.bsp.IdeInputs import scala.build.errors.{BuildException, WorkspaceError} -import scala.build.input.{Inputs, WorkspaceOrigin} +import scala.build.input.{Inputs, OnDisk, Virtual, WorkspaceOrigin} import scala.build.internal.{Constants, CustomCodeWrapper} import scala.build.options.{BuildOptions, Scope} import scala.cli.CurrentParams @@ -106,7 +106,7 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] { ): Either[BuildException, Option[os.Path]] = either { val virtualInputs = inputs.elements.collect { - case v: Inputs.Virtual => v + case v: Virtual => v } if (virtualInputs.nonEmpty) value(Left(new FoundVirtualInputsError(virtualInputs))) @@ -126,13 +126,13 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] { val scalaCliBspInputsJsonDestination = inputs.workspace / Constants.workspaceDirName / "ide-inputs.json" - val inputArgs = inputs.elements.collect { case d: Inputs.OnDisk => d.path.toString } + val inputArgs = inputs.elements.collect { case d: OnDisk => d.path.toString } val ideInputs = IdeInputs( options.shared.validateInputArgs(args) .flatMap(_.toOption) .flatten - .collect { case d: Inputs.OnDisk => d.path.toString } + .collect { case d: OnDisk => d.path.toString } ) val debugOpt = options.shared.jvm.bspDebugPort.toSeq.map(port => diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala index 947e83bc35..a744d074c3 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala @@ -15,7 +15,7 @@ import scala.build.* import scala.build.blooprifle.BloopRifleConfig import scala.build.compiler.{BloopCompilerMaker, ScalaCompilerMaker, SimpleScalaCompilerMaker} import scala.build.errors.{AmbiguousPlatformError, BuildException} -import scala.build.input.Inputs +import scala.build.input.{Element, Inputs, ResourceDirectory} import scala.build.interactive.Interactive import scala.build.interactive.Interactive.{InteractiveAsk, InteractiveNop} import scala.build.internal.CsLoggerUtil.* @@ -70,7 +70,7 @@ object SharedOptionsUtil extends CommandHelpers { logger.message(s"WARNING: provided resource directory path doesn't exist: $path") path } - .map(Inputs.ResourceDirectory.apply) + .map(ResourceDirectory.apply) val maybeInputs = Inputs( args, Os.pwd, @@ -416,7 +416,7 @@ object SharedOptionsUtil extends CommandHelpers { def allScalaSnippets: List[String] = v.snippet.scalaSnippet ++ v.snippet.executeScala def allJavaSnippets: List[String] = v.snippet.javaSnippet ++ v.snippet.executeJava - def validateInputArgs(args: Seq[String]): Seq[Either[String, Seq[Inputs.Element]]] = + def validateInputArgs(args: Seq[String]): Seq[Either[String, Seq[Element]]] = Inputs.validateArgs( args, Os.pwd, diff --git a/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala b/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala index 1f854aae2e..e143fe84b2 100644 --- a/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala +++ b/modules/cli/src/main/scala/scala/cli/errors/FoundVirtualInputsError.scala @@ -1,10 +1,10 @@ package scala.cli.errors import scala.build.errors.BuildException -import scala.build.input.Inputs +import scala.build.input.{Inputs, Virtual} final class FoundVirtualInputsError( - val virtualInputs: Seq[Inputs.Virtual] + val virtualInputs: Seq[Virtual] ) extends BuildException( s"Found virtual inputs: ${virtualInputs.map(_.source).mkString(", ")}" ) { diff --git a/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala b/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala index ed86ea7d8f..3fcdc157e1 100644 --- a/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala +++ b/modules/cli/src/main/scala/scala/cli/internal/CachedBinary.scala @@ -5,7 +5,7 @@ import java.nio.charset.StandardCharsets import java.security.MessageDigest import scala.build.Build -import scala.build.input.Inputs +import scala.build.input.{Inputs, OnDisk, ResourceDirectory} import scala.build.internal.Constants object CachedBinary { @@ -43,9 +43,9 @@ object CachedBinary { Iterator("\n") val projectResourceDirsIt = build.inputs.elements.iterator.flatMap { - case elem: Inputs.OnDisk => + case elem: OnDisk => val content = elem match { - case resDirInput: Inputs.ResourceDirectory => + case resDirInput: ResourceDirectory => hashResourceDir(resDirInput.path) case _ => List.empty } From 254a3da98349c5a06948fdd317fd9585458b3bf0 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Wed, 9 Nov 2022 15:52:46 +0100 Subject: [PATCH 4/6] Extract logic relevant to input.Elements to InputsUtil --- .../main/scala/scala/build/CrossSources.scala | 2 +- .../main/scala/scala/build/input/Inputs.scala | 81 ++----------------- .../scala/scala/build/input/InputsUtil.scala | 79 ++++++++++++++++++ .../scala/scala/build/tests/InputsTests.scala | 5 +- 4 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 modules/build/src/main/scala/scala/build/input/InputsUtil.scala diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index 5fd9c5f930..0cad2a0f7c 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -236,7 +236,7 @@ object CrossSources { lazy val dir = sourcePath / os.up lazy val subPath = sourcePath.subRelativeTo(dir) if (os.isDir(sourcePath)) - Right(Inputs.singleFilesFromDirectory(Directory(sourcePath), enableMarkdown)) + Right(InputsUtil.singleFilesFromDirectory(Directory(sourcePath), enableMarkdown)) else if (sourcePath == os.sub / "project.scala") Right(Seq(ProjectScalaFile(dir, subPath))) else if (sourcePath.ext == "scala") Right(Seq(SourceScalaFile(dir, subPath))) diff --git a/modules/build/src/main/scala/scala/build/input/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala index 8495665bd1..d21f7ee4e3 100644 --- a/modules/build/src/main/scala/scala/build/input/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -32,7 +32,7 @@ final case class Inputs( def singleFiles(): Seq[SingleFile] = elements.flatMap { case f: SingleFile => Seq(f) - case d: Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) + case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown) case _: ResourceDirectory => Nil case _: Virtual => Nil } @@ -53,13 +53,13 @@ final case class Inputs( def flattened(): Seq[SingleElement] = elements.flatMap { case f: SingleFile => Seq(f) - case d: Directory => Inputs.singleFilesFromDirectory(d, enableMarkdown) + case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown) case _: ResourceDirectory => Nil case v: Virtual => Seq(v) } private lazy val inputsHash: String = - Inputs.inputsHash(elements) + InputsUtil.inputsHash(elements) lazy val projectName: String = { val needsSuffix = mayAppendHash && (elements match { case Seq(d: Directory) => d.path != workspace @@ -82,7 +82,7 @@ final case class Inputs( private def inHomeDir(directories: Directories): Inputs = copy( - workspace = Inputs.homeWorkspace(elements, directories), + workspace = InputsUtil.homeWorkspace(elements, directories), mayAppendHash = false, workspaceOrigin = Some(WorkspaceOrigin.HomeDir) ) @@ -111,7 +111,7 @@ final case class Inputs( case elem: OnDisk => val content = elem match { case dirInput: Directory => - Seq("dir:") ++ Inputs.singleFilesFromDirectory(dirInput, enableMarkdown) + Seq("dir:") ++ InputsUtil.singleFilesFromDirectory(dirInput, enableMarkdown) .map(file => s"${file.path}:" + os.read(file.path)) case _ => Seq(os.read(elem.path)) } @@ -135,75 +135,6 @@ final case class Inputs( } object Inputs { - def singleFilesFromDirectory( - d: Directory, - enableMarkdown: Boolean - ): Seq[SingleFile] = { - import Ordering.Implicits.seqOrdering - os.walk.stream(d.path, skip = _.last.startsWith(".")) - .filter(os.isFile(_)) - .collect { - case p if p.last.endsWith(".java") => - JavaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last == "project.scala" => - ProjectScalaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".scala") => - SourceScalaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".sc") => - Script(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".c") || p.last.endsWith(".h") => - CFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".md") && enableMarkdown => - MarkdownFile(d.path, p.subRelativeTo(d.path)) - } - .toVector - .sortBy(_.subPath.segments) - } - - def projectSettingsFiles(elements: Seq[Element]): Seq[ProjectScalaFile] = - elements.flatMap { - case f: ProjectScalaFile => Seq(f) - case d: Directory => Inputs.configFileFromDirectory(d) - case _ => Nil - }.distinct - - def configFileFromDirectory(d: Directory): Seq[ProjectScalaFile] = - if (os.exists(d.path / "project.scala")) - Seq(ProjectScalaFile(d.path, os.sub / "project.scala")) - else Nil - - private def inputsHash(elements: Seq[Element]): String = { - def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) - val it = elements.iterator.flatMap { - case elem: OnDisk => - val prefix = elem match { - case _: Directory => "dir:" - case _: ResourceDirectory => "resource-dir:" - case _: JavaFile => "java:" - case _: ProjectScalaFile => "config:" - case _: SourceScalaFile => "scala:" - case _: CFile => "c:" - case _: Script => "sc:" - case _: MarkdownFile => "md:" - } - Iterator(prefix, elem.path.toString, "\n").map(bytes) - case v: Virtual => - Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n")) - } - val md = MessageDigest.getInstance("SHA-1") - it.foreach(md.update) - val digest = md.digest() - val calculatedSum = new BigInteger(1, digest) - String.format(s"%040x", calculatedSum).take(10) - } - - def homeWorkspace(elements: Seq[Element], directories: Directories): os.Path = { - val hash0 = inputsHash(elements) - val dir = directories.virtualProjectsDir / hash0.take(2) / s"project-${hash0.drop(2)}" - os.makeDir.all(dir) - dir - } - private def forValidatedElems( validElems: Seq[Element], baseProjectName: String, @@ -217,7 +148,7 @@ object Inputs { assert(extraClasspathWasPassed || validElems.nonEmpty) val (inferredWorkspace, inferredNeedsHash, workspaceOrigin) = { - val settingsFiles = projectSettingsFiles(validElems) + val settingsFiles = InputsUtil.projectSettingsFiles(validElems) val dirsAndFiles = validElems.collect { case d: Directory => d case f: SourceFile => f diff --git a/modules/build/src/main/scala/scala/build/input/InputsUtil.scala b/modules/build/src/main/scala/scala/build/input/InputsUtil.scala new file mode 100644 index 0000000000..bd7a2a1549 --- /dev/null +++ b/modules/build/src/main/scala/scala/build/input/InputsUtil.scala @@ -0,0 +1,79 @@ +package scala.build.input + +import java.math.BigInteger +import java.nio.charset.StandardCharsets +import java.security.MessageDigest + +import scala.build.Directories + +object InputsUtil { + def singleFilesFromDirectory( + d: Directory, + enableMarkdown: Boolean + ): Seq[SingleFile] = { + import Ordering.Implicits.seqOrdering + os.walk.stream(d.path, skip = _.last.startsWith(".")) + .filter(os.isFile(_)) + .collect { + case p if p.last.endsWith(".java") => + JavaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last == "project.scala" => + ProjectScalaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".scala") => + SourceScalaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".sc") => + Script(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".c") || p.last.endsWith(".h") => + CFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".md") && enableMarkdown => + MarkdownFile(d.path, p.subRelativeTo(d.path)) + } + .toVector + .sortBy(_.subPath.segments) + } + + def projectSettingsFiles(elements: Seq[Element]): Seq[ProjectScalaFile] = + elements.flatMap { + case f: ProjectScalaFile => Seq(f) + case d: Directory => configFileFromDirectory(d) + case _ => Nil + }.distinct + + def configFileFromDirectory(d: Directory): Seq[ProjectScalaFile] = + if (os.exists(d.path / "project.scala")) + Seq(ProjectScalaFile(d.path, os.sub / "project.scala")) + else Nil + + def inputsHash(elements: Seq[Element]): String = { + def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) + + val it = elements.iterator.flatMap { + case elem: OnDisk => + val prefix = elem match { + case _: Directory => "dir:" + case _: ResourceDirectory => "resource-dir:" + case _: JavaFile => "java:" + case _: ProjectScalaFile => "config:" + case _: SourceScalaFile => "scala:" + case _: CFile => "c:" + case _: Script => "sc:" + case _: MarkdownFile => "md:" + } + Iterator(prefix, elem.path.toString, "\n").map(bytes) + case v: Virtual => + Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n")) + } + val md = MessageDigest.getInstance("SHA-1") + it.foreach(md.update) + val digest = md.digest() + val calculatedSum = new BigInteger(1, digest) + String.format(s"%040x", calculatedSum).take(10) + } + + def homeWorkspace(elements: Seq[Element], directories: Directories): os.Path = { + val hash0 = inputsHash(elements) + val dir = directories.virtualProjectsDir / hash0.take(2) / s"project-${hash0.drop(2)}" + os.makeDir.all(dir) + dir + } +} diff --git a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala index e66fb68c11..5bbea724d0 100644 --- a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala @@ -1,8 +1,9 @@ package scala.build.tests import com.eed3si9n.expecty.Expecty.expect + import scala.build.Build -import scala.build.input.Inputs +import scala.build.input.{Inputs, InputsUtil} import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion} import scala.build.tests.util.BloopServer import scala.build.{BuildThreads, Directories, LocalRepo} @@ -100,7 +101,7 @@ class InputsTests extends munit.FunSuite { testInputs.withBuild(buildOptions, buildThreads, bloopConfigOpt) { (root, inputs, _) => assert(os.exists(root / Constants.workspaceDirName)) - assert(Inputs.projectSettingsFiles(inputs.elements).length == 1) + assert(InputsUtil.projectSettingsFiles(inputs.elements).length == 1) } } } From 5b8f760aac500d4dbdf196972eab0782212be4ef Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 10 Nov 2022 13:39:58 +0100 Subject: [PATCH 5/6] NIT Refactor ElementsUtils - convert functions to extensions - other Scala 3 syntax changes - formatting fixes --- .../main/scala/scala/build/CrossSources.scala | 3 +- .../scala/build/input/ElementsUtils.scala | 80 +++++++++++++++++++ .../main/scala/scala/build/input/Inputs.scala | 20 +++-- .../scala/scala/build/input/InputsUtil.scala | 79 ------------------ .../scala/scala/build/tests/InputsTests.scala | 5 +- 5 files changed, 94 insertions(+), 93 deletions(-) create mode 100644 modules/build/src/main/scala/scala/build/input/ElementsUtils.scala delete mode 100644 modules/build/src/main/scala/scala/build/input/InputsUtil.scala diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index 0cad2a0f7c..362ad844ba 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -4,6 +4,7 @@ import scala.build.EitherCps.{either, value} import scala.build.Ops.* import scala.build.Positioned import scala.build.errors.{BuildException, CompositeBuildException, MalformedDirectiveError} +import scala.build.input.ElementsUtils.* import scala.build.input.* import scala.build.options.{ BuildOptions, @@ -236,7 +237,7 @@ object CrossSources { lazy val dir = sourcePath / os.up lazy val subPath = sourcePath.subRelativeTo(dir) if (os.isDir(sourcePath)) - Right(InputsUtil.singleFilesFromDirectory(Directory(sourcePath), enableMarkdown)) + Right(Directory(sourcePath).singleFilesFromDirectory(enableMarkdown)) else if (sourcePath == os.sub / "project.scala") Right(Seq(ProjectScalaFile(dir, subPath))) else if (sourcePath.ext == "scala") Right(Seq(SourceScalaFile(dir, subPath))) diff --git a/modules/build/src/main/scala/scala/build/input/ElementsUtils.scala b/modules/build/src/main/scala/scala/build/input/ElementsUtils.scala new file mode 100644 index 0000000000..08ebfd8214 --- /dev/null +++ b/modules/build/src/main/scala/scala/build/input/ElementsUtils.scala @@ -0,0 +1,80 @@ +package scala.build.input + +import java.math.BigInteger +import java.nio.charset.StandardCharsets +import java.security.MessageDigest + +import scala.build.Directories + +object ElementsUtils { + extension (d: Directory) { + def singleFilesFromDirectory(enableMarkdown: Boolean): Seq[SingleFile] = { + import Ordering.Implicits.seqOrdering + os.walk.stream(d.path, skip = _.last.startsWith(".")) + .filter(os.isFile(_)) + .collect { + case p if p.last.endsWith(".java") => + JavaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last == "project.scala" => + ProjectScalaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".scala") => + SourceScalaFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".sc") => + Script(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".c") || p.last.endsWith(".h") => + CFile(d.path, p.subRelativeTo(d.path)) + case p if p.last.endsWith(".md") && enableMarkdown => + MarkdownFile(d.path, p.subRelativeTo(d.path)) + } + .toVector + .sortBy(_.subPath.segments) + } + + def configFile: Seq[ProjectScalaFile] = + if (os.exists(d.path / "project.scala")) + Seq(ProjectScalaFile(d.path, os.sub / "project.scala")) + else Nil + } + + extension (elements: Seq[Element]) { + def projectSettingsFiles: Seq[ProjectScalaFile] = + elements.flatMap { + case f: ProjectScalaFile => Seq(f) + case d: Directory => d.configFile + case _ => Nil + }.distinct + + def inputsHash: String = { + def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) + + val it = elements.iterator.flatMap { + case elem: OnDisk => + val prefix = elem match { + case _: Directory => "dir:" + case _: ResourceDirectory => "resource-dir:" + case _: JavaFile => "java:" + case _: ProjectScalaFile => "config:" + case _: SourceScalaFile => "scala:" + case _: CFile => "c:" + case _: Script => "sc:" + case _: MarkdownFile => "md:" + } + Iterator(prefix, elem.path.toString, "\n").map(bytes) + case v: Virtual => + Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n")) + } + val md = MessageDigest.getInstance("SHA-1") + it.foreach(md.update) + val digest = md.digest() + val calculatedSum = new BigInteger(1, digest) + String.format(s"%040x", calculatedSum).take(10) + } + + def homeWorkspace(directories: Directories): os.Path = { + val hash0 = elements.inputsHash + val dir = directories.virtualProjectsDir / hash0.take(2) / s"project-${hash0.drop(2)}" + os.makeDir.all(dir) + dir + } + } +} diff --git a/modules/build/src/main/scala/scala/build/input/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala index d21f7ee4e3..2acc29ffce 100644 --- a/modules/build/src/main/scala/scala/build/input/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -8,6 +8,7 @@ import java.security.MessageDigest import scala.annotation.tailrec import scala.build.Directories import scala.build.errors.{BuildException, InputsException} +import scala.build.input.ElementsUtils.* import scala.build.internal.Constants import scala.build.internal.zip.WrappedZipInputStream import scala.build.options.Scope @@ -32,7 +33,7 @@ final case class Inputs( def singleFiles(): Seq[SingleFile] = elements.flatMap { case f: SingleFile => Seq(f) - case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown) + case d: Directory => d.singleFilesFromDirectory(enableMarkdown) case _: ResourceDirectory => Nil case _: Virtual => Nil } @@ -44,22 +45,19 @@ final case class Inputs( def virtualSourceFiles(): Seq[Virtual] = elements.flatMap { - case v: Virtual => - Seq(v) - case _ => - Nil + case v: Virtual => Seq(v) + case _ => Nil } def flattened(): Seq[SingleElement] = elements.flatMap { case f: SingleFile => Seq(f) - case d: Directory => InputsUtil.singleFilesFromDirectory(d, enableMarkdown) + case d: Directory => d.singleFilesFromDirectory(enableMarkdown) case _: ResourceDirectory => Nil case v: Virtual => Seq(v) } - private lazy val inputsHash: String = - InputsUtil.inputsHash(elements) + private lazy val inputsHash: String = elements.inputsHash lazy val projectName: String = { val needsSuffix = mayAppendHash && (elements match { case Seq(d: Directory) => d.path != workspace @@ -82,7 +80,7 @@ final case class Inputs( private def inHomeDir(directories: Directories): Inputs = copy( - workspace = InputsUtil.homeWorkspace(elements, directories), + workspace = elements.homeWorkspace(directories), mayAppendHash = false, workspaceOrigin = Some(WorkspaceOrigin.HomeDir) ) @@ -111,7 +109,7 @@ final case class Inputs( case elem: OnDisk => val content = elem match { case dirInput: Directory => - Seq("dir:") ++ InputsUtil.singleFilesFromDirectory(dirInput, enableMarkdown) + Seq("dir:") ++ dirInput.singleFilesFromDirectory(enableMarkdown) .map(file => s"${file.path}:" + os.read(file.path)) case _ => Seq(os.read(elem.path)) } @@ -148,7 +146,7 @@ object Inputs { assert(extraClasspathWasPassed || validElems.nonEmpty) val (inferredWorkspace, inferredNeedsHash, workspaceOrigin) = { - val settingsFiles = InputsUtil.projectSettingsFiles(validElems) + val settingsFiles = validElems.projectSettingsFiles val dirsAndFiles = validElems.collect { case d: Directory => d case f: SourceFile => f diff --git a/modules/build/src/main/scala/scala/build/input/InputsUtil.scala b/modules/build/src/main/scala/scala/build/input/InputsUtil.scala deleted file mode 100644 index bd7a2a1549..0000000000 --- a/modules/build/src/main/scala/scala/build/input/InputsUtil.scala +++ /dev/null @@ -1,79 +0,0 @@ -package scala.build.input - -import java.math.BigInteger -import java.nio.charset.StandardCharsets -import java.security.MessageDigest - -import scala.build.Directories - -object InputsUtil { - def singleFilesFromDirectory( - d: Directory, - enableMarkdown: Boolean - ): Seq[SingleFile] = { - import Ordering.Implicits.seqOrdering - os.walk.stream(d.path, skip = _.last.startsWith(".")) - .filter(os.isFile(_)) - .collect { - case p if p.last.endsWith(".java") => - JavaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last == "project.scala" => - ProjectScalaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".scala") => - SourceScalaFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".sc") => - Script(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".c") || p.last.endsWith(".h") => - CFile(d.path, p.subRelativeTo(d.path)) - case p if p.last.endsWith(".md") && enableMarkdown => - MarkdownFile(d.path, p.subRelativeTo(d.path)) - } - .toVector - .sortBy(_.subPath.segments) - } - - def projectSettingsFiles(elements: Seq[Element]): Seq[ProjectScalaFile] = - elements.flatMap { - case f: ProjectScalaFile => Seq(f) - case d: Directory => configFileFromDirectory(d) - case _ => Nil - }.distinct - - def configFileFromDirectory(d: Directory): Seq[ProjectScalaFile] = - if (os.exists(d.path / "project.scala")) - Seq(ProjectScalaFile(d.path, os.sub / "project.scala")) - else Nil - - def inputsHash(elements: Seq[Element]): String = { - def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) - - val it = elements.iterator.flatMap { - case elem: OnDisk => - val prefix = elem match { - case _: Directory => "dir:" - case _: ResourceDirectory => "resource-dir:" - case _: JavaFile => "java:" - case _: ProjectScalaFile => "config:" - case _: SourceScalaFile => "scala:" - case _: CFile => "c:" - case _: Script => "sc:" - case _: MarkdownFile => "md:" - } - Iterator(prefix, elem.path.toString, "\n").map(bytes) - case v: Virtual => - Iterator(bytes("virtual:"), v.content, bytes(v.source), bytes("\n")) - } - val md = MessageDigest.getInstance("SHA-1") - it.foreach(md.update) - val digest = md.digest() - val calculatedSum = new BigInteger(1, digest) - String.format(s"%040x", calculatedSum).take(10) - } - - def homeWorkspace(elements: Seq[Element], directories: Directories): os.Path = { - val hash0 = inputsHash(elements) - val dir = directories.virtualProjectsDir / hash0.take(2) / s"project-${hash0.drop(2)}" - os.makeDir.all(dir) - dir - } -} diff --git a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala index 5bbea724d0..f9b93a2856 100644 --- a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala @@ -3,7 +3,8 @@ package scala.build.tests import com.eed3si9n.expecty.Expecty.expect import scala.build.Build -import scala.build.input.{Inputs, InputsUtil} +import scala.build.input.Inputs +import scala.build.input.ElementsUtils.* import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion} import scala.build.tests.util.BloopServer import scala.build.{BuildThreads, Directories, LocalRepo} @@ -101,7 +102,7 @@ class InputsTests extends munit.FunSuite { testInputs.withBuild(buildOptions, buildThreads, bloopConfigOpt) { (root, inputs, _) => assert(os.exists(root / Constants.workspaceDirName)) - assert(InputsUtil.projectSettingsFiles(inputs.elements).length == 1) + assert(inputs.elements.projectSettingsFiles.length == 1) } } } From 8bf026fbc398f0d40a722ba07bf56cefc3f92ae7 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 10 Nov 2022 14:18:46 +0100 Subject: [PATCH 6/6] NIT Refactor Inputs - remove dead code - fix formatting - add missing type declarations - apply Scala 3 syntax - misc fixes --- .../main/scala/scala/build/input/Inputs.scala | 37 ++++--------------- .../scala/scala/build/tests/InputsTests.scala | 13 ++++--- .../scala/scala/build/tests/TestInputs.scala | 1 - .../scala/cli/commands/clean/Clean.scala | 1 - .../cli/commands/util/SharedOptionsUtil.scala | 1 - 5 files changed, 15 insertions(+), 38 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/input/Inputs.scala b/modules/build/src/main/scala/scala/build/input/Inputs.scala index 2acc29ffce..141d9fd4dc 100644 --- a/modules/build/src/main/scala/scala/build/input/Inputs.scala +++ b/modules/build/src/main/scala/scala/build/input/Inputs.scala @@ -27,8 +27,7 @@ final case class Inputs( allowRestrictedFeatures: Boolean ) { - def isEmpty: Boolean = - elements.isEmpty + def isEmpty: Boolean = elements.isEmpty def singleFiles(): Seq[SingleFile] = elements.flatMap { @@ -43,12 +42,6 @@ final case class Inputs( case f: SourceFile => f } - def virtualSourceFiles(): Seq[Virtual] = - elements.flatMap { - case v: Virtual => Seq(v) - case _ => Nil - } - def flattened(): Seq[SingleElement] = elements.flatMap { case f: SingleFile => Seq(f) @@ -63,17 +56,14 @@ final case class Inputs( case Seq(d: Directory) => d.path != workspace case _ => true }) - if (needsSuffix) baseProjectName + "-" + inputsHash - else baseProjectName + if needsSuffix then s"$baseProjectName-$inputsHash" else baseProjectName } def scopeProjectName(scope: Scope): String = - if (scope == Scope.Main) projectName - else projectName + "-" + scope.name + if scope == Scope.Main then projectName else s"$projectName-${scope.name}" def add(extraElements: Seq[Element]): Inputs = - if (elements.isEmpty) this - else copy(elements = (elements ++ extraElements).distinct) + if elements.isEmpty then this else copy(elements = (elements ++ extraElements).distinct) def generatedSrcRoot(scope: Scope): os.Path = workspace / Constants.workspaceDirName / projectName / "src_generated" / scope.name @@ -85,8 +75,7 @@ final case class Inputs( workspaceOrigin = Some(WorkspaceOrigin.HomeDir) ) def avoid(forbidden: Seq[os.Path], directories: Directories): Inputs = - if (forbidden.exists(workspace.startsWith)) inHomeDir(directories) - else this + if forbidden.exists(workspace.startsWith) then inHomeDir(directories) else this def checkAttributes(directories: Directories): Inputs = { @tailrec def existingParent(p: os.Path): Option[os.Path] = @@ -100,8 +89,7 @@ final case class Inputs( os.owner(p) == os.owner(os.home) && p.toIO.canWrite val canWrite = existingParent(workspace).exists(reallyOwnedByUser) - if (canWrite) this - else inHomeDir(directories) + if canWrite then this else inHomeDir(directories) } def sourceHash(): String = { def bytes(s: String): Array[Byte] = s.getBytes(StandardCharsets.UTF_8) @@ -136,22 +124,18 @@ object Inputs { private def forValidatedElems( validElems: Seq[Element], baseProjectName: String, - directories: Directories, forcedWorkspace: Option[os.Path], enableMarkdown: Boolean, allowRestrictedFeatures: Boolean, extraClasspathWasPassed: Boolean ): Inputs = { - assert(extraClasspathWasPassed || validElems.nonEmpty) - val (inferredWorkspace, inferredNeedsHash, workspaceOrigin) = { val settingsFiles = validElems.projectSettingsFiles val dirsAndFiles = validElems.collect { case d: Directory => d case f: SourceFile => f } - settingsFiles.headOption.map { s => if (settingsFiles.length > 1) System.err.println( @@ -287,7 +271,7 @@ object Inputs { } else if (arg.contains("://")) { val url = - if (githubGistsArchiveRegex.findFirstMatchIn(arg).nonEmpty) s"$arg/download" else arg + if githubGistsArchiveRegex.findFirstMatchIn(arg).nonEmpty then s"$arg/download" else arg download(url).map { content => if (githubGistsArchiveRegex.findFirstMatchIn(arg).nonEmpty) resolveZipArchive(content) @@ -318,7 +302,6 @@ object Inputs { private def forNonEmptyArgs( args: Seq[String], cwd: os.Path, - directories: Directories, baseProjectName: String, download: String => Either[String, Array[Byte]], stdinOpt: => Option[Array[Byte]], @@ -348,7 +331,6 @@ object Inputs { Right(forValidatedElems( validElems, baseProjectName, - directories, forcedWorkspace, enableMarkdown, allowRestrictedFeatures, @@ -362,7 +344,6 @@ object Inputs { def apply( args: Seq[String], cwd: os.Path, - directories: Directories, baseProjectName: String = "project", defaultInputs: () => Option[Inputs] = () => None, download: String => Either[String, Array[Byte]] = _ => Left("URL not supported"), @@ -386,7 +367,6 @@ object Inputs { forNonEmptyArgs( args, cwd, - directories, baseProjectName, download, stdinOpt, @@ -400,8 +380,7 @@ object Inputs { extraClasspathWasPassed ) - def default(): Option[Inputs] = - None + def default(): Option[Inputs] = None def empty(workspace: os.Path, enableMarkdown: Boolean): Inputs = Inputs( diff --git a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala index f9b93a2856..c5db622f90 100644 --- a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala @@ -3,6 +3,7 @@ package scala.build.tests import com.eed3si9n.expecty.Expecty.expect import scala.build.Build +import scala.build.blooprifle.BloopRifleConfig import scala.build.input.Inputs import scala.build.input.ElementsUtils.* import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion} @@ -11,11 +12,11 @@ import scala.build.{BuildThreads, Directories, LocalRepo} import scala.build.internal.Constants class InputsTests extends munit.FunSuite { - val buildThreads = BuildThreads.create() - val extraRepoTmpDir = os.temp.dir(prefix = "scala-cli-tests-extra-repo-") - val directories = Directories.under(extraRepoTmpDir) - def bloopConfigOpt = Some(BloopServer.bloopConfig) - val buildOptions = BuildOptions( + val buildThreads: BuildThreads = BuildThreads.create() + val extraRepoTmpDir: os.Path = os.temp.dir(prefix = "scala-cli-tests-extra-repo-") + val directories: Directories = Directories.under(extraRepoTmpDir) + def bloopConfigOpt: Option[BloopRifleConfig] = Some(BloopServer.bloopConfig) + val buildOptions: BuildOptions = BuildOptions( internal = InternalOptions( localRepository = LocalRepo.localRepo(directories.localRepoDir), keepDiagnostics = true @@ -57,7 +58,7 @@ class InputsTests extends munit.FunSuite { (root, _, buildMaybe) => val javaOptsCheck = buildMaybe match { case Right(build: Build.Successful) => - build.options.javaOptions.javaOpts.toSeq(0).value.value == "-Dfoo=bar" + build.options.javaOptions.javaOpts.toSeq.head.value.value == "-Dfoo=bar" case _ => false } assert(javaOptsCheck) diff --git a/modules/build/src/test/scala/scala/build/tests/TestInputs.scala b/modules/build/src/test/scala/scala/build/tests/TestInputs.scala index 6bfeb4fae3..d5c93f5ea6 100644 --- a/modules/build/src/test/scala/scala/build/tests/TestInputs.scala +++ b/modules/build/src/test/scala/scala/build/tests/TestInputs.scala @@ -42,7 +42,6 @@ final case class TestInputs( val res = Inputs( inputArgs0, tmpDir, - Directories.under(tmpDir / ".data"), forcedWorkspace = forcedWorkspaceOpt.map(_.resolveFrom(tmpDir)), allowRestrictedFeatures = true, extraClasspathWasPassed = false diff --git a/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala b/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala index 796dd9e88c..9142280f45 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/clean/Clean.scala @@ -16,7 +16,6 @@ object Clean extends ScalaCommand[CleanOptions] { val inputs = Inputs( args.all, Os.pwd, - options.directories.directories, defaultInputs = () => Inputs.default(), forcedWorkspace = options.workspace.forcedWorkspaceOpt, allowRestrictedFeatures = ScalaCli.allowRestrictedFeatures, diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala index a744d074c3..704b786135 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/SharedOptionsUtil.scala @@ -74,7 +74,6 @@ object SharedOptionsUtil extends CommandHelpers { val maybeInputs = Inputs( args, Os.pwd, - directories, defaultInputs = defaultInputs, download = downloadInputs(cache), stdinOpt = readStdin(logger = logger),