diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 00000000000..9118d398866 --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,10 @@ +rules = [ + NoAutoTupling, + DisableSyntax, + NoValInForComprehension, + RedundantSyntax, + RemoveUnused, + ProcedureSyntax +] + +DisableSyntax.noThrows = true diff --git a/3rdparty/jvm/org/scalameta/BUILD b/3rdparty/jvm/org/scalameta/BUILD index 20dbab280f6..7c1fdfc0567 100644 --- a/3rdparty/jvm/org/scalameta/BUILD +++ b/3rdparty/jvm/org/scalameta/BUILD @@ -1,11 +1,22 @@ # Copyright 2021 Pants project contributors (see CONTRIBUTORS.md). # Licensed under the Apache License, Version 2.0 (see LICENSE). +scala_artifact( + name="semanticdb-jar", + group="org.scalameta", + artifact="semanticdb-scalac", + version="4.8.4", + resolve="jvm_testprojects", + crossversion="full", +) + +scalac_plugin(name="semanticdb", artifact=":semanticdb-jar") + # Note: This target must be kept in sync with the requirements in `generate_scala_parser_lockfile_request`. -jvm_artifact( +scala_artifact( name="scalameta", group="org.scalameta", - artifact="scalameta_2.13", + artifact="scalameta", version="4.8.7", packages=["scala.meta.**"], resolve="scala_parser_dev", diff --git a/3rdparty/jvm/testprojects.lockfile b/3rdparty/jvm/testprojects.lockfile index 9c1d685d671..d21b04d5e14 100644 --- a/3rdparty/jvm/testprojects.lockfile +++ b/3rdparty/jvm/testprojects.lockfile @@ -1,12 +1,13 @@ # This lockfile was autogenerated by Pants. To regenerate, run: # -# ./pants generate-lockfiles +# pants generate-lockfiles # # --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- # { # "version": 1, # "generated_with_requirements": [ -# "org.scala-lang:scala-library:2.13.6,url=not_provided,jar=not_provided" +# "org.scala-lang:scala-library:2.13.6,url=not_provided,jar=not_provided", +# "org.scalameta:semanticdb-scalac_2.13.6:4.8.4,url=not_provided,jar=not_provided" # ] # } # --- END PANTS LOCKFILE METADATA --- @@ -24,3 +25,26 @@ packaging = "jar" [entries.file_digest] fingerprint = "f19ed732e150d3537794fd3fe42ee18470a3f707efd499ecd05a99e727ff6c8a" serialized_bytes_length = 5955737 +[[entries]] +file_name = "org.scalameta_semanticdb-scalac_2.13.6_4.8.4.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.6" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.6" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "semanticdb-scalac_2.13.6" +version = "4.8.4" +packaging = "jar" +[entries.file_digest] +fingerprint = "acc1f667d4e98b42ba851309feb391cf301afeeeeddb8c172874a2184b18b057" +serialized_bytes_length = 17073222 diff --git a/docs/docs/jvm/java-and-scala.mdx b/docs/docs/jvm/java-and-scala.mdx index 50942b0d20b..95a327462bd 100644 --- a/docs/docs/jvm/java-and-scala.mdx +++ b/docs/docs/jvm/java-and-scala.mdx @@ -312,6 +312,43 @@ Once enabled, `lint` and `fmt` will check and automatically reformat your code: ❯ pants --changed-since=HEAD fmt ``` +### Fix Scala code + +Additionally to the previously mentioned tools, `scalafix` can also be enabled by adding the `pants.backend.experimental.scala.lint.scalafix` backend to `backend_packages` in the `[GLOBAL]` section of `pants.toml`. However to take full advantage of it additional settings are required. + +If we want to use Scalafix's semantic rules, Scalafix needs to be able to find `.semanticdb` compiled files in our classpath. In versions prior to Scala 3 this is achieved by adding the `semanticdb` scalac plugin to our build. Find which is the right version of it for the Scala version you are using and add the following targets: + +```python +scala_artifact( + name="semanticdb-jar", + group="org.scalameta", + artifact="semanticdb-scalac", + version="", + crossversion="full", +) + +scalac_plugin(name="semanticdb", artifact=":semanticdb-jar") +``` + +Now you will need to add the `scalac_plugins` field to your scala targets like in the following: + +```python +scala_sources(scalac_plugins=["semanticdb"]) +``` + +Alternatively, you could add `semanticdb` to the `[scalac].plugins_for_resolve` setting: + +```toml pants.toml +[scalac.plugins_for_resolve] +jvm-default = "semanticdb" +``` + +:::note Scalafix and Scala 3 +At the moment the support for Scalac 3 in Scalafix is limited, most of the syntactic rules work but not that many in the semantic front. + +Despite those raugh edges, Scalafix is a great linting tool for Scala 3, just note that the setup is different than from prior versions: Instead of adding a scalac plugin to our build, we only need to add the `-Xsemanticdb` flag to our `[scalac].args` settings to enable the generation of `.semanticdb` compiled files. +::: + ## Working in an IDE Pants supports loading Java and Scala projects in IntelliJ via the [BSP protocol](https://build-server-protocol.github.io/) (which should ease VSCode support [via Metals](https://scalameta.org/metals/docs/editors/vscode), although it is not yet supported). diff --git a/pants.toml b/pants.toml index 0f06b7060c3..6b91bb1bbd9 100644 --- a/pants.toml +++ b/pants.toml @@ -32,6 +32,7 @@ backend_packages.add = [ "pants.backend.experimental.python.packaging.pyoxidizer", "pants.backend.experimental.scala", "pants.backend.experimental.scala.lint.scalafmt", + "pants.backend.experimental.scala.lint.scalafix", "pants.backend.experimental.scala.debug_goals", "pants.backend.experimental.tools.workunit_logger", "pants.backend.experimental.visibility", @@ -234,5 +235,8 @@ jar_tool_dev = "src/python/pants/jvm/jar_tool/jar_tool.lock" [scala] version_for_resolve = { "scala_parser_dev" = "2.13.8" } +[scalac] +args = ["-Yrangepos", "-Xlint:unused"] + [scala-infer] force_add_siblings_as_dependencies = false diff --git a/src/python/pants/backend/experimental/scala/lint/BUILD b/src/python/pants/backend/experimental/scala/lint/BUILD new file mode 100644 index 00000000000..3928f7e3ba8 --- /dev/null +++ b/src/python/pants/backend/experimental/scala/lint/BUILD @@ -0,0 +1,4 @@ +# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +python_sources() diff --git a/src/python/pants/backend/experimental/scala/lint/__init__.py b/src/python/pants/backend/experimental/scala/lint/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/python/pants/backend/experimental/scala/lint/scalafix/BUILD b/src/python/pants/backend/experimental/scala/lint/scalafix/BUILD new file mode 100644 index 00000000000..68aaac88424 --- /dev/null +++ b/src/python/pants/backend/experimental/scala/lint/scalafix/BUILD @@ -0,0 +1,4 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +python_sources() diff --git a/src/python/pants/backend/experimental/scala/lint/scalafix/__init__.py b/src/python/pants/backend/experimental/scala/lint/scalafix/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/python/pants/backend/experimental/scala/lint/scalafix/register.py b/src/python/pants/backend/experimental/scala/lint/scalafix/register.py new file mode 100644 index 00000000000..01152151e99 --- /dev/null +++ b/src/python/pants/backend/experimental/scala/lint/scalafix/register.py @@ -0,0 +1,14 @@ +# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +from pants.backend.experimental.scala.register import rules as all_scala_rules +from pants.backend.scala.lint.scalafix import extra_fields +from pants.backend.scala.lint.scalafix import rules as scalafix_rules + + +def rules(): + return [ + *all_scala_rules(), + *scalafix_rules.rules(), + *extra_fields.rules(), + ] diff --git a/src/python/pants/backend/scala/dependency_inference/BUILD b/src/python/pants/backend/scala/dependency_inference/BUILD index ed088279cf7..26b58ac2d70 100644 --- a/src/python/pants/backend/scala/dependency_inference/BUILD +++ b/src/python/pants/backend/scala/dependency_inference/BUILD @@ -10,8 +10,9 @@ python_tests(name="tests", timeout=240) scala_sources( name="scala_parser", resolve="scala_parser_dev", - # TODO: Allow the parser files to be formatted. + # TODO: Allow the parser files to be formatted and linted. skip_scalafmt=True, + skip_scalafix=True, ) jvm_artifact( diff --git a/src/python/pants/backend/scala/lint/scalafix/BUILD b/src/python/pants/backend/scala/lint/scalafix/BUILD new file mode 100644 index 00000000000..fb4d4d54cde --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/BUILD @@ -0,0 +1,10 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +python_sources(dependencies=[":lockfile"]) + +python_tests(name="tests", dependencies=[":test-lockfiles"]) + +resource(name="lockfile", source="scalafix.default.lockfile.txt") + +resources(name="test-lockfiles", sources=["*.test.lock"]) diff --git a/src/python/pants/backend/scala/lint/scalafix/__init__.py b/src/python/pants/backend/scala/lint/scalafix/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/python/pants/backend/scala/lint/scalafix/extra_fields.py b/src/python/pants/backend/scala/lint/scalafix/extra_fields.py new file mode 100644 index 00000000000..269af0be1a0 --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/extra_fields.py @@ -0,0 +1,15 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +from pants.backend.scala.target_types import SCALA_SOURCES_TARGET_TYPES +from pants.engine.target import BoolField + + +class SkipScalafixField(BoolField): + alias = "skip_scalafix" + default = False + help = "If true, don't run `scalafix` on this target's code." + + +def rules(): + return [tgt.register_plugin_field(SkipScalafixField) for tgt in SCALA_SOURCES_TARGET_TYPES] diff --git a/src/python/pants/backend/scala/lint/scalafix/rules.py b/src/python/pants/backend/scala/lint/scalafix/rules.py new file mode 100644 index 00000000000..99fae3d4d7a --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/rules.py @@ -0,0 +1,395 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). +from __future__ import annotations + +import os.path +from collections import defaultdict +from dataclasses import dataclass +from pathlib import PurePath +from typing import Iterable, cast + +from pants.backend.scala.lint.scalafix.extra_fields import SkipScalafixField +from pants.backend.scala.lint.scalafix.subsystem import ScalafixSubsystem +from pants.backend.scala.subsystems.scala import ScalaSubsystem +from pants.backend.scala.subsystems.scalac import Scalac +from pants.backend.scala.target_types import ScalaSourceField +from pants.backend.scala.util_rules.versions import ScalaVersion +from pants.core.goals.fix import FixResult, FixTargetsRequest, Partitions +from pants.core.goals.generate_lockfiles import GenerateToolLockfileSentinel +from pants.core.goals.lint import LintResult, LintTargetsRequest +from pants.core.util_rules.config_files import ( + GatherConfigFilesByDirectoriesRequest, + GatheredConfigFilesByDirectories, +) +from pants.core.util_rules.partitions import Partition +from pants.core.util_rules.source_files import SourceFiles +from pants.core.util_rules.stripped_source_files import StrippedSourceFiles +from pants.engine.addresses import Addresses, UnparsedAddressInputs +from pants.engine.fs import AddPrefix, Digest, DigestSubset, MergeDigests, PathGlobs, Snapshot +from pants.engine.process import FallibleProcessResult +from pants.engine.rules import Get, MultiGet, collect_rules, rule +from pants.engine.target import FieldSet, Target +from pants.engine.unions import UnionRule +from pants.jvm.classpath import Classpath +from pants.jvm.compile import ClasspathEntry +from pants.jvm.goals import lockfile +from pants.jvm.jdk_rules import InternalJdk, JvmProcess +from pants.jvm.resolve.coursier_fetch import ToolClasspath, ToolClasspathRequest +from pants.jvm.resolve.jvm_tool import GenerateJvmLockfileFromTool, GenerateJvmToolLockfileSentinel +from pants.jvm.resolve.key import CoursierResolveKey +from pants.jvm.subsystems import JvmSubsystem +from pants.jvm.target_types import JvmResolveField +from pants.source.source_root import SourceRootsRequest, SourceRootsResult +from pants.util.dirutil import group_by_dir +from pants.util.frozendict import FrozenDict +from pants.util.logging import LogLevel +from pants.util.strutil import Simplifier, pluralize + + +@dataclass(frozen=True) +class ScalafixFieldSet(FieldSet): + required_fields = (ScalaSourceField,) + + source: ScalaSourceField + resolve: JvmResolveField + + @classmethod + def opt_out(cls, tgt: Target) -> bool: + return tgt.get(SkipScalafixField).value + + +# We define one request for `fix` and another one for `lint` because scalafix supports +# rules that have not automatic resolution and which make the process fail. +# +# In those scenarios, ignoring the tool's exit code and relying on detecting changes +# in the output files doesn't give the desired behavior. So having two distinct request +# types, one for each type of operation, targets each use case individually. + + +class ScalafixFixRequest(FixTargetsRequest): + field_set_type = ScalafixFieldSet + tool_subsystem = ScalafixSubsystem + + +class ScalafixLintRequest(LintTargetsRequest): + field_set_type = ScalafixFieldSet + tool_subsystem = ScalafixSubsystem + + +@dataclass(frozen=True) +class ScalafixPartitionInfo: + scala_version: ScalaVersion + config_snapshot: Snapshot + runtime_classpath_entries: tuple[str, ...] + compile_classpath_entries: tuple[str, ...] + rule_classpath_entries: tuple[str, ...] + extra_immutable_input_digests: FrozenDict[str, Digest] + + @property + def description(self) -> str: + return self.config_snapshot.files[0] + + +class ScalafixToolLockfileSentinel(GenerateJvmToolLockfileSentinel): + resolve_name = ScalafixSubsystem.options_scope + + +@dataclass(frozen=True) +class _MaybeClasspath: + classpath: Classpath | None + + def args(self, *, prefix: str = "") -> Iterable[str]: + if not self.classpath: + return [] + + return self.classpath.immutable_inputs_args(prefix=prefix) + + def immutable_inputs(self, *, prefix: str = "") -> Iterable[tuple[str, Digest]]: + if not self.classpath: + return [] + + return self.classpath.immutable_inputs(prefix=prefix) + + +async def _resolve_scalafix_rule_classpath( + scalafix: ScalafixSubsystem, +) -> _MaybeClasspath: + if not scalafix.rule_targets: + return _MaybeClasspath(classpath=None) + + classpath = await Get(Classpath, UnparsedAddressInputs, scalafix.rule_targets) + return _MaybeClasspath(classpath) + + +@dataclass(frozen=True) +class _ScalafixPartitionRequest: + field_sets: tuple[ScalafixFieldSet, ...] + + +@rule +async def _partition_scalafix( + request: _ScalafixPartitionRequest, + scala: ScalaSubsystem, + scalafix: ScalafixSubsystem, + jvm: JvmSubsystem, +) -> Partitions[ScalafixPartitionInfo]: + if scalafix.skip: + return Partitions() + + runtimecp_relpath = "__runtimecp" + compilecp_relpath = "__compilecp" + rulecp_relpath = "__rulecp" + + classpaths: Iterable[Classpath] = () + if scalafix.semantic_rules: + classpaths = await MultiGet( + Get(Classpath, Addresses([field_set.address])) for field_set in request.field_sets + ) + rule_classpath = await _resolve_scalafix_rule_classpath(scalafix) + + filepaths = tuple(field_set.source.file_path for field_set in request.field_sets) + classpath_by_filepath = dict(zip(filepaths, classpaths)) + lockfile_request = await Get(GenerateJvmLockfileFromTool, ScalafixToolLockfileSentinel()) + tool_runtime_classpath, config_files = await MultiGet( + Get(ToolClasspath, ToolClasspathRequest(lockfile=lockfile_request)), + Get( + GatheredConfigFilesByDirectories, + GatherConfigFilesByDirectoriesRequest( + tool_name="scalafix", + config_filename=scalafix.config_file_name, + filepaths=filepaths, + orphan_filepath_behavior=scalafix.orphan_files_behavior, + ), + ), + ) + + # Determine the Scala version being used by each file. + # A single file can be mapped to more than one Scala version in cross-compilation scenarios. + scala_versions_by_filepath: dict[str, set[ScalaVersion]] = defaultdict(set) + for field_set in request.field_sets: + resolve = field_set.resolve.normalized_value(jvm) + scala_versions_by_filepath[field_set.source.file_path].add( + scala.version_for_resolve(resolve) + ) + + # Partition the work by which source files share the same config file and Scala version (regardless of directory). + partitioned_source_files: dict[tuple[str, ScalaVersion], set[str]] = defaultdict(set) + for source_dir, files_in_source_dir in group_by_dir(filepaths).items(): + config_file = config_files.source_dir_to_config_file[source_dir] + for name in files_in_source_dir: + filename = os.path.join(source_dir, name) + # We choose the earliest Scala version for those cases in which we have + # cross-compiled sources. + scala_version = sorted(scala_versions_by_filepath[filename])[0] + partitioned_source_files[(config_file, scala_version)].add(filename) + + config_file_snapshots = await MultiGet( + Get(Snapshot, DigestSubset(config_files.snapshot.digest, PathGlobs([config_file]))) + for (config_file, _) in partitioned_source_files + ) + + def combine_classpaths(classpaths: Iterable[Classpath]) -> Classpath: + classpath_entries: set[ClasspathEntry] = set() + # Requires type annotation due to https://github.com/python/mypy/issues/5423 + resolve_key: CoursierResolveKey | None = None + for clspath in classpaths: + if resolve_key is None: + resolve_key = clspath.resolve + elif resolve_key != clspath.resolve: + raise ValueError("Can not combine classpaths for different resolves.") + classpath_entries.update(clspath.entries) + + assert resolve_key + return Classpath(tuple(classpath_entries), resolve_key) + + def classpath_for_files(files: Iterable[str]) -> _MaybeClasspath: + classpaths_to_combine: set[Classpath] = set() + for file in files: + filepath = PurePath(file) + for path_pattern, classpath in classpath_by_filepath.items(): + if filepath.match(path_pattern): + classpaths_to_combine.add(classpath) + + if not classpaths_to_combine: + return _MaybeClasspath(None) + + return _MaybeClasspath(combine_classpaths(classpaths_to_combine)) + + def partition_info_for( + files: Iterable[str], config_snapshot: Snapshot, scala_version: ScalaVersion + ) -> ScalafixPartitionInfo: + classpath = classpath_for_files(files) + return ScalafixPartitionInfo( + scala_version=scala_version, + runtime_classpath_entries=tuple( + tool_runtime_classpath.classpath_entries(runtimecp_relpath) + ), + compile_classpath_entries=tuple(classpath.args(prefix=compilecp_relpath)), + rule_classpath_entries=tuple(rule_classpath.args(prefix=rulecp_relpath)), + config_snapshot=config_snapshot, + extra_immutable_input_digests=FrozenDict( + { + runtimecp_relpath: tool_runtime_classpath.digest, + **dict(classpath.immutable_inputs(prefix=compilecp_relpath)), + **dict(rule_classpath.immutable_inputs(prefix=rulecp_relpath)), + } + ), + ) + + return Partitions( + Partition( + tuple(files), + partition_info_for(files, config_snapshot, scala_version), + ) + for ((_, scala_version), files), config_snapshot in zip( + partitioned_source_files.items(), config_file_snapshots + ) + ) + + +@rule +def _scalafix_fix_partitions( + request: ScalafixFixRequest.PartitionRequest[ScalafixFieldSet], +) -> _ScalafixPartitionRequest: + return _ScalafixPartitionRequest(request.field_sets) + + +@rule +async def _scalafix_lint_partitions( + request: ScalafixLintRequest.PartitionRequest[ScalafixFieldSet], +) -> _ScalafixPartitionRequest: + return _ScalafixPartitionRequest(request.field_sets) + + +async def _restore_source_roots(source_roots_result: SourceRootsResult, digest: Digest) -> Snapshot: + source_roots_to_files = defaultdict(set) + for file, root in source_roots_result.path_to_root.items(): + source_roots_to_files[root.path].add(str(file.relative_to(root.path))) + + digest_subsets = await MultiGet( + Get(Digest, DigestSubset(digest, PathGlobs(files))) + for files in source_roots_to_files.values() + ) + + restored_digests = await MultiGet( + Get(Digest, AddPrefix(digest, source_root)) + for digest, source_root in zip(digest_subsets, source_roots_to_files.keys()) + ) + return await Get(Snapshot, MergeDigests(restored_digests)) + + +@dataclass(frozen=True) +class _ScalafixProcess: + snapshot: Snapshot + partition_info: ScalafixPartitionInfo + check_only: bool + + +@rule +async def _run_scalafix_process( + request: _ScalafixProcess, jdk: InternalJdk, scalac: Scalac, scalafix: ScalafixSubsystem +) -> FallibleProcessResult: + partition_info = request.partition_info + + merged_digest = await Get( + Digest, MergeDigests([partition_info.config_snapshot.digest, request.snapshot.digest]) + ) + + return await Get( + FallibleProcessResult, + JvmProcess( + jdk=jdk, + argv=[ + "scalafix.cli.Cli", + f"--config={partition_info.config_snapshot.files[0]}", + f"--scala-version={partition_info.scala_version}", + *( + (f"--classpath={':'.join(partition_info.compile_classpath_entries)}",) + if partition_info.compile_classpath_entries + else () + ), + *( + (f"--tool-classpath={':'.join(partition_info.rule_classpath_entries)}",) + if partition_info.rule_classpath_entries + else () + ), + *(("--check",) if request.check_only else ()), + *((f"--scalac-options={arg}" for arg in scalac.args) if scalac.args else ()), + *(f"--files={file}" for file in request.snapshot.files), + ], + classpath_entries=partition_info.runtime_classpath_entries, + input_digest=merged_digest, + output_files=request.snapshot.files, + extra_jvm_options=scalafix.jvm_options, + extra_immutable_input_digests=partition_info.extra_immutable_input_digests, + use_nailgun=False, + description=f"Run `scalafix` on {pluralize(len(request.snapshot.files), 'file')}.", + level=LogLevel.DEBUG, + ), + ) + + +@rule +async def scalafix_fix(request: ScalafixFixRequest.Batch) -> FixResult: + source_roots = await Get( + SourceRootsResult, SourceRootsRequest, SourceRootsRequest.for_files(request.snapshot.files) + ) + + # We need to strip the source files to get semantic rules find SemanticDB metadata in the classpath + stripped_source_files = await Get(StrippedSourceFiles, SourceFiles(request.snapshot, ())) + + process_result = await Get( + FallibleProcessResult, + _ScalafixProcess( + snapshot=stripped_source_files.snapshot, + partition_info=cast(ScalafixPartitionInfo, request.partition_metadata), + check_only=False, + ), + ) + + # We need now to restore the source roots + result_snapshot = await _restore_source_roots(source_roots, process_result.output_digest) + output_simplifier = Simplifier() + + return FixResult( + input=request.snapshot, + output=result_snapshot, + stdout=output_simplifier.simplify(process_result.stdout), + stderr=output_simplifier.simplify(process_result.stderr), + tool_name=request.tool_name, + ) + + +@rule +async def scalafix_lint(request: ScalafixLintRequest.Batch) -> LintResult: + # We need to strip the source files to get semantic rules find SemanticDB metadata in the classpath + source_snapshot = await Get(Snapshot, PathGlobs(request.elements)) + stripped_source_files = await Get(StrippedSourceFiles, SourceFiles(source_snapshot, ())) + + process_result = await Get( + FallibleProcessResult, + _ScalafixProcess( + snapshot=stripped_source_files.snapshot, + partition_info=cast(ScalafixPartitionInfo, request.partition_metadata), + check_only=True, + ), + ) + + return LintResult.create(request, process_result) + + +@rule +async def generate_scalafix_lockfile_request( + _: ScalafixToolLockfileSentinel, tool: ScalafixSubsystem +) -> GenerateJvmLockfileFromTool: + return GenerateJvmLockfileFromTool.create(tool) + + +def rules(): + return [ + *collect_rules(), + *lockfile.rules(), + *ScalafixFixRequest.rules(), + *ScalafixLintRequest.rules(), + UnionRule(GenerateToolLockfileSentinel, ScalafixToolLockfileSentinel), + ] diff --git a/src/python/pants/backend/scala/lint/scalafix/rules_integration_test.py b/src/python/pants/backend/scala/lint/scalafix/rules_integration_test.py new file mode 100644 index 00000000000..aabd72f0323 --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/rules_integration_test.py @@ -0,0 +1,549 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). +from __future__ import annotations + +from textwrap import dedent +from typing import Any, Callable, TypeVar, overload + +import pytest + +from internal_plugins.test_lockfile_fixtures.lockfile_fixture import ( + JVMLockfileFixture, + JVMLockfileFixtureDefinition, +) +from pants.backend.scala import target_types +from pants.backend.scala.compile import scalac +from pants.backend.scala.lint.scalafix import extra_fields +from pants.backend.scala.lint.scalafix.rules import ( + ScalafixFieldSet, + ScalafixFixRequest, + ScalafixLintRequest, + ScalafixPartitionInfo, +) +from pants.backend.scala.lint.scalafix.rules import rules as scalafix_rules +from pants.backend.scala.lint.scalafix.subsystem import DEFAULT_SCALAFIX_CONFIG_FILENAME +from pants.backend.scala.resolve.artifact import rules as scala_artifact_rules +from pants.backend.scala.target_types import ( + ScalacPluginTarget, + ScalaSourcesGeneratorTarget, + ScalaSourceTarget, +) +from pants.build_graph.address import Address +from pants.core.goals.fix import FixResult +from pants.core.goals.fmt import Partitions +from pants.core.goals.lint import LintResult +from pants.core.util_rules import config_files, source_files, stripped_source_files, system_binaries +from pants.core.util_rules.external_tool import rules as external_tool_rules +from pants.core.util_rules.partitions import Partition +from pants.engine.fs import PathGlobs, Snapshot +from pants.engine.rules import QueryRule +from pants.engine.target import Target +from pants.jvm import classpath +from pants.jvm.dependency_inference import artifact_mapper +from pants.jvm.jdk_rules import rules as jdk_rules +from pants.jvm.resolve.coursier_fetch import rules as coursier_fetch_rules +from pants.jvm.resolve.coursier_setup import rules as coursier_setup_rules +from pants.jvm.strip_jar import strip_jar +from pants.jvm.target_types import JvmArtifactTarget +from pants.jvm.testutil import maybe_skip_jdk_test +from pants.jvm.util_rules import rules as util_rules +from pants.testutil.rule_runner import PYTHON_BOOTSTRAP_ENV, RuleRunner, logging + + +@pytest.fixture +def rule_runner() -> RuleRunner: + rule_runner = RuleRunner( + rules=[ + *config_files.rules(), + *classpath.rules(), + *coursier_fetch_rules(), + *coursier_setup_rules(), + *external_tool_rules(), + *source_files.rules(), + *stripped_source_files.rules(), + *artifact_mapper.rules(), + *strip_jar.rules(), + *scalac.rules(), + *util_rules(), + *jdk_rules(), + *target_types.rules(), + *scala_artifact_rules(), + *scalafix_rules(), + *extra_fields.rules(), + *system_binaries.rules(), + QueryRule(Partitions, (ScalafixFixRequest.PartitionRequest,)), + QueryRule(Partitions, (ScalafixLintRequest.PartitionRequest,)), + QueryRule(FixResult, (ScalafixFixRequest.Batch,)), + QueryRule(LintResult, (ScalafixLintRequest.Batch,)), + QueryRule(Snapshot, (PathGlobs,)), + ], + target_types=[ + ScalaSourceTarget, + ScalacPluginTarget, + ScalaSourcesGeneratorTarget, + JvmArtifactTarget, + ], + ) + return rule_runner + + +@overload +def run_scalafix_fix( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: None = None, +) -> FixResult: + ... + + +@overload +def run_scalafix_fix( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: dict[str, tuple[str, ...]], +) -> list[FixResult]: + ... + + +def run_scalafix_fix( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: dict[str, tuple[str, ...]] | None = None, +) -> FixResult | list[FixResult]: + def create_batch_request( + name: str, partition: Partition[str, ScalafixPartitionInfo] + ) -> ScalafixFixRequest.Batch: + snapshot = rule_runner.request(Snapshot, [PathGlobs(partition.elements)]) + return ScalafixFixRequest.Batch( + name, + partition.elements, + partition_metadata=partition.metadata, + snapshot=snapshot, + ) + + return _run_scalafix( + rule_runner, + targets, + output_type=FixResult, + paritition_req_call=lambda x: ScalafixFixRequest.PartitionRequest(x), + batch_req_call=create_batch_request, + extra_options=extra_options, + expected_partitions=expected_partitions, + ) + + +@overload +def run_scalafix_lint( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: None = None, +) -> LintResult: + ... + + +@overload +def run_scalafix_lint( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: dict[str, tuple[str, ...]], +) -> list[LintResult]: + ... + + +def run_scalafix_lint( + rule_runner: RuleRunner, + targets: list[Target], + *, + extra_options: list[str] = [], + expected_partitions: dict[str, tuple[str, ...]] | None = None, +) -> LintResult | list[LintResult]: + def create_batch_request( + name: str, partition: Partition[str, ScalafixPartitionInfo] + ) -> ScalafixLintRequest.Batch: + return ScalafixLintRequest.Batch( + name, partition.elements, partition_metadata=partition.metadata + ) + + return _run_scalafix( + rule_runner, + targets, + output_type=LintResult, + paritition_req_call=lambda x: ScalafixLintRequest.PartitionRequest(x), + batch_req_call=create_batch_request, + extra_options=extra_options, + expected_partitions=expected_partitions, + ) + + +_Out = TypeVar("_Out") + + +def _run_scalafix( + rule_runner: RuleRunner, + targets: list[Target], + *, + output_type: type[_Out], + paritition_req_call: Callable[[tuple[ScalafixFieldSet, ...]], Any], + batch_req_call: Callable[[str, Partition[str, ScalafixPartitionInfo]], Any], + extra_options: list[str] = [], + expected_partitions: dict[str, tuple[str, ...]] | None = None, +) -> _Out | list[_Out]: + rule_runner.set_options(extra_options, env_inherit=PYTHON_BOOTSTRAP_ENV) + + field_sets = [ScalafixFieldSet.create(tgt) for tgt in targets] + partitions = rule_runner.request( + Partitions[ScalafixPartitionInfo], [paritition_req_call(tuple(field_sets))] + ) + + results = [ + rule_runner.request( + output_type, + [batch_req_call("scalafix", partition)], + ) + for partition in partitions + ] + return results if expected_partitions else results[0] + + +BASIC_SCALAFIX_CONF = dedent( + """\ + rules = [ DisableSyntax ] + """ +) + +GOOD_FILE = """\ +object Foo { + def hello = "hello" +} +""" + +BAD_FILE = """\ +object Foo { + def throwException = throw new IllegalArgumentException +} +""" + +BAD_FILE_STDOUT = """\ +Foo.scala:2:24: error: [DisableSyntax.throw] exceptions should be avoided, consider encoding the error in the return type instead + def throwException = throw new IllegalArgumentException + ^^^^^ +""" + + +@maybe_skip_jdk_test +def test_lint_failure(rule_runner: RuleRunner) -> None: + rule_runner.write_files( + { + "Foo.scala": BAD_FILE, + "BUILD": "scala_sources(name='test')", + ".scalafix.conf": dedent( + """\ + rules = [ DisableSyntax ] + DisableSyntax.noThrows = true + """ + ), + } + ) + + tgt = rule_runner.get_target(Address("", target_name="test", relative_file_path="Foo.scala")) + + lint_result = run_scalafix_lint( + rule_runner, + [tgt], + extra_options=["--scalafix-semantic-rules=False"], + ) + + assert lint_result.stdout == BAD_FILE_STDOUT + assert lint_result.exit_code != 0 + + +@maybe_skip_jdk_test +def test_multiple_targets(rule_runner: RuleRunner) -> None: + rule_runner.write_files( + { + "Foo.scala": BAD_FILE, + "Bar.scala": GOOD_FILE, + "BUILD": "scala_sources(name='test')", + ".scalafix.conf": dedent( + """\ + rules = [ DisableSyntax ] + DisableSyntax.noThrows = true + """ + ), + } + ) + + tgts = [ + rule_runner.get_target(Address("", target_name="test", relative_file_path="Foo.scala")), + rule_runner.get_target(Address("", target_name="test", relative_file_path="Bar.scala")), + ] + + lint_result = run_scalafix_lint( + rule_runner, + tgts, + extra_options=["--scalafix-semantic-rules=False"], + ) + assert lint_result.exit_code != 0 + + +@maybe_skip_jdk_test +def test_multiple_config_files(rule_runner: RuleRunner) -> None: + rule_runner.write_files( + { + DEFAULT_SCALAFIX_CONFIG_FILENAME: BASIC_SCALAFIX_CONF, + "foo/BUILD": "scala_sources()", + "foo/Foo.scala": GOOD_FILE, + "foo/bar/BUILD": "scala_sources()", + "foo/bar/Bar.scala": BAD_FILE, + f"foo/bar/{DEFAULT_SCALAFIX_CONFIG_FILENAME}": dedent( + f"""\ + {BASIC_SCALAFIX_CONF} + DisableSyntax.noThrows = true + """ + ), + } + ) + + tgts = [ + rule_runner.get_target(Address("foo", target_name="foo", relative_file_path="Foo.scala")), + rule_runner.get_target( + Address("foo/bar", target_name="bar", relative_file_path="Bar.scala") + ), + ] + lint_results = run_scalafix_lint( + rule_runner, + tgts, + extra_options=["--scalafix-semantic-rules=False"], + expected_partitions={ + DEFAULT_SCALAFIX_CONFIG_FILENAME: ("foo/Foo.scala",), + "foo/bar/" + DEFAULT_SCALAFIX_CONFIG_FILENAME: ("foo/bar/Bar.scala",), + }, + ) + + assert lint_results[0].exit_code == 0 + assert lint_results[1].exit_code != 0 + + +@pytest.fixture +def semanticdb_lockfile_def() -> JVMLockfileFixtureDefinition: + return JVMLockfileFixtureDefinition( + "semanticdb-scalac-2.13.12.test.lock", + ["org.scala-lang:scala-library:2.13.12", "org.scalameta:semanticdb-scalac_2.13.12:4.8.14"], + ) + + +@pytest.fixture +def semanticdb_lockfile( + semanticdb_lockfile_def: JVMLockfileFixtureDefinition, request +) -> JVMLockfileFixture: + return semanticdb_lockfile_def.load(request) + + +@maybe_skip_jdk_test +def test_builtin_semanticdb_rule( + rule_runner: RuleRunner, semanticdb_lockfile: JVMLockfileFixture +) -> None: + rule_runner.write_files( + { + "3rdparty/jvm/default.lock": semanticdb_lockfile.serialized_lockfile, + "3rdparty/jvm/BUILD": semanticdb_lockfile.requirements_as_jvm_artifact_targets(), + "src/jvm/Foo.scala": dedent( + """\ + import scala.List + import scala.collection.{immutable, mutable} + object Foo { immutable.Seq.empty[Int] } + """ + ), + "src/jvm/BUILD": dedent( + """\ + scalac_plugin( + name="semanticdb", + artifact="//3rdparty/jvm:org.scalameta_semanticdb-scalac_2.13.12" + ) + + scala_sources(scalac_plugins=["semanticdb"]) + """ + ), + ".scalafix.conf": "rules = [ RemoveUnused ]", + } + ) + + tgt = rule_runner.get_target(Address("src/jvm", relative_file_path="Foo.scala")) + + scalac_args = ["-Yrangepos", "-Xlint:unused"] + fix_result = run_scalafix_fix( + rule_runner, + [tgt], + extra_options=[ + f"--scala-version-for-resolve={repr({'jvm-default': '2.13.12'})}", + f"--source-root-patterns={repr(['src/jvm'])}", + f"--scalac-args={repr(scalac_args)}", + ], + ) + assert fix_result.output == rule_runner.make_snapshot( + { + "src/jvm/Foo.scala": dedent( + """ + import scala.collection.immutable + object Foo { immutable.Seq.empty[Int] } + """ + ) + } + ) + assert fix_result.did_change is True + + +@pytest.fixture +def scala_rewrites_lockfile_def() -> JVMLockfileFixtureDefinition: + return JVMLockfileFixtureDefinition( + "scala-rewrites-2.13.12.test.lock", + [ + "org.scala-lang:scala-library:2.13.12", + "org.scalameta:semanticdb-scalac_2.13.12:4.8.14", + "org.scala-lang:scala-rewrites_2.13:0.1.5", + ], + ) + + +@pytest.fixture +def scala_rewrites_lockfile( + scala_rewrites_lockfile_def: JVMLockfileFixtureDefinition, request +) -> JVMLockfileFixture: + return scala_rewrites_lockfile_def.load(request) + + +@logging +@maybe_skip_jdk_test +def test_run_custom_rule( + rule_runner: RuleRunner, scala_rewrites_lockfile: JVMLockfileFixture +) -> None: + rule_runner.write_files( + { + "3rdparty/jvm/default.lock": scala_rewrites_lockfile.serialized_lockfile, + "3rdparty/jvm/BUILD": scala_rewrites_lockfile.requirements_as_jvm_artifact_targets(), + "src/jvm/Foo.scala": dedent( + """\ + object Foo { + def hello = "hello" + def nil = Nil + hello + } + """ + ), + "src/jvm/BUILD": dedent( + """\ + scalac_plugin( + name="semanticdb", + artifact="//3rdparty/jvm:org.scalameta_semanticdb-scalac_2.13.12" + ) + + scala_sources(name='test', scalac_plugins=["semanticdb"]) + """ + ), + ".scalafix.conf": "rules = [ fix.scala213.Any2StringAdd ]", + } + ) + + tgt = rule_runner.get_target( + Address("src/jvm", target_name="test", relative_file_path="Foo.scala") + ) + + rule_targets = ["3rdparty/jvm:org.scala-lang_scala-rewrites_2.13"] + scalac_args = ["-Yrangepos", "-deprecation"] + fix_result = run_scalafix_fix( + rule_runner, + [tgt], + extra_options=[ + f"--scala-version-for-resolve={repr({'jvm-default': '2.13.12'})}", + f"--source-root-patterns={repr(['src/jvm'])}", + f"--scalac-args={repr(scalac_args)}", + f"--scalafix-rule-targets={repr(rule_targets)}", + ], + ) + assert fix_result.output == rule_runner.make_snapshot( + { + "src/jvm/Foo.scala": dedent( + """\ + object Foo { + def hello = "hello" + def nil = String.valueOf(Nil) + hello + } + """ + ) + } + ) + assert fix_result.did_change is True + + +@pytest.fixture +def scala3_lockfile_def() -> JVMLockfileFixtureDefinition: + return JVMLockfileFixtureDefinition( + "scala3.test.lock", + ["org.scala-lang:scala3-library_3:3.3.1"], + ) + + +@pytest.fixture +def scala3_lockfile( + scala3_lockfile_def: JVMLockfileFixtureDefinition, request +) -> JVMLockfileFixture: + return scala3_lockfile_def.load(request) + + +@maybe_skip_jdk_test +def test_builtin_syntactic_rule_scala3( + rule_runner: RuleRunner, scala3_lockfile: JVMLockfileFixture +) -> None: + rule_runner.write_files( + { + "3rdparty/jvm/default.lock": scala3_lockfile.serialized_lockfile, + "3rdparty/jvm/BUILD": scala3_lockfile.requirements_as_jvm_artifact_targets(), + "src/jvm/Foo.scala": dedent( + """\ + object SignificantIndentation: + implicit class XtensionVal(val str: String) extends AnyVal: + def doubled: String = str + str + """ + ), + "src/jvm/BUILD": dedent( + """\ + scala_sources() + """ + ), + ".scalafix.conf": "rules = [ LeakingImplicitClassVal ]", + } + ) + + tgt = rule_runner.get_target(Address("src/jvm", relative_file_path="Foo.scala")) + + fix_result = run_scalafix_fix( + rule_runner, + [tgt], + extra_options=[ + f"--scala-version-for-resolve={repr({'jvm-default': '3.3.1'})}", + f"--source-root-patterns={repr(['src/jvm'])}", + "--scalafix-semantic-rules=False", + ], + ) + + assert fix_result.output == rule_runner.make_snapshot( + { + "src/jvm/Foo.scala": dedent( + """\ + object SignificantIndentation: + implicit class XtensionVal(private val str: String) extends AnyVal: + def doubled: String = str + str + """ + ) + } + ) + assert fix_result.did_change is True diff --git a/src/python/pants/backend/scala/lint/scalafix/scala-rewrites-2.13.12.test.lock b/src/python/pants/backend/scala/lint/scalafix/scala-rewrites-2.13.12.test.lock new file mode 100644 index 00000000000..02c1dc87a48 --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/scala-rewrites-2.13.12.test.lock @@ -0,0 +1,1735 @@ +# This lockfile was autogenerated by Pants. To regenerate, run: +# +# pants internal-generate-test-lockfile-fixtures :: +# +# --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +# { +# "version": 1, +# "generated_with_requirements": [ +# "org.scala-lang:scala-library:2.13.12,url=not_provided,jar=not_provided", +# "org.scala-lang:scala-rewrites_2.13:0.1.5,url=not_provided,jar=not_provided", +# "org.scalameta:semanticdb-scalac_2.13.12:4.8.14,url=not_provided,jar=not_provided" +# ] +# } +# --- END PANTS LOCKFILE METADATA --- + +[[entries]] +file_name = "ch.epfl.scala_scalafix-core_2.13_0.11.0.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "a3c60a8abae0bc8c3b36926060cd1e87431a81b67ef87134e11545395a95cdb3" +serialized_bytes_length = 1129878 +[[entries]] +file_name = "ch.epfl.scala_scalafix-rules_2.13_0.11.0.jar" +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.11" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.11" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "ecdbcc8dbbbe74c83952965d2384453e8ab45058c3d0b8eee7d75e709e857755" +serialized_bytes_length = 414243 +[[entries]] +file_name = "com.geirsson_metaconfig-core_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "26a731767c34ccf165ec86984c9e349d382a85ceaddd44bb438ac4970f89e0cb" +serialized_bytes_length = 527426 +[[entries]] +file_name = "com.geirsson_metaconfig-pprint_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "1df65fcac6437d2dd7bf244061b252e168bad49ee066bb4ddd17062a47ac0d6b" +serialized_bytes_length = 33886 +[[entries]] +file_name = "com.geirsson_metaconfig-typesafe-config_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "d1c823e1eb7f794b49b36f2340994b56c5dcdd6d3e689ab536c07212c7f88d49" +serialized_bytes_length = 17265 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.google.protobuf_protobuf-java_3.19.2.jar" + +[entries.coord] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" +[entries.file_digest] +fingerprint = "3446cbfa13795228bc6549b91a409f27cdf6913d1c8f03e0f99572988623a04b" +serialized_bytes_length = 1681866 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.googlecode.java-diff-utils_diffutils_1.3.0.jar" + +[entries.coord] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "61ba4dc49adca95243beaa0569adc2a23aedb5292ae78aa01186fa782ebdc5c2" +serialized_bytes_length = 34130 +[[entries]] +file_name = "com.lihaoyi_fansi_2.13_0.3.0.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + + +[entries.coord] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "2f1d4cdd8971ef2cca8c37da8a04cb0ecf94bc89e59c6383185e88cde21f2e86" +serialized_bytes_length = 64609 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.lihaoyi_geny_2.13_0.6.5.jar" + +[entries.coord] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" +[entries.file_digest] +fingerprint = "ca3857a3f95266e0d87e1a1f26c8592c53c12ac7203f911759415f6c8a43df7d" +serialized_bytes_length = 85365 +[[entries]] +file_name = "com.lihaoyi_sourcecode_2.13_0.3.0.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "6e5b2d55e942b450a222bfd3ebc23e99ca03716e42da25af1b2c8cde038100f5" +serialized_bytes_length = 119136 +[[entries]] +file_name = "com.thesamet.scalapb_lenses_2.13_0.11.11.jar" +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" +[entries.file_digest] +fingerprint = "3da04a4ffd7b537ec90beb0d2fa456198a7c6844cc39a16be5aad3961ee59e5c" +serialized_bytes_length = 34790 +[[entries]] +file_name = "com.thesamet.scalapb_scalapb-runtime_2.13_0.11.11.jar" +[[entries.directDependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" +[entries.file_digest] +fingerprint = "11415623de89db09d64902a38ada91c037714d10f01e2337bb1b9afc3a4072b6" +serialized_bytes_length = 2427221 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.typesafe_config_1.4.1.jar" + +[entries.coord] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "4c0aa7e223c75c8840c41fc183d4cd3118140a1ee503e3e08ce66ed2794c948f" +serialized_bytes_length = 295197 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "io.github.java-diff-utils_java-diff-utils_4.12.jar" + +[entries.coord] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5" +serialized_bytes_length = 72305 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "net.java.dev.jna_jna_5.13.0.jar" + +[entries.coord] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb" +serialized_bytes_length = 1879325 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.jline_jline_3.22.0.jar" + +[entries.coord] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3" +serialized_bytes_length = 1060013 +[[entries]] +file_name = "org.scala-lang.modules_scala-collection-compat_2.13_2.10.0.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "bb10091bd55131a5327bdeddede74e5d8a695acab24a97567111784f2f427299" +serialized_bytes_length = 5596 +[[entries]] +file_name = "org.scala-lang_scala-compiler_2.13.11.jar" +[[entries.directDependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.dependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" +[entries.file_digest] +fingerprint = "c5a14770370e73a69367b131da1533890200b1e2aa70643b73f9ff31ef2e69ec" +serialized_bytes_length = 12137574 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.scala-lang_scala-library_2.13.12.jar" + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "c6a879e4973a60f6162668542a33eaccc2bb565d1c934fb061c5844259131dd1" +serialized_bytes_length = 5917034 +[[entries]] +file_name = "org.scala-lang_scala-reflect_2.13.11.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" +[entries.file_digest] +fingerprint = "6a46ed9b333857e8b5ea668bb254ed8e47dacd1116bf53ade9467aa4ae8f1818" +serialized_bytes_length = 3760106 +[[entries]] +file_name = "org.scala-lang_scala-rewrites_2.13_0.1.5.jar" +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.11" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-rewrites_2.13" +version = "0.1.5" +packaging = "jar" +[entries.file_digest] +fingerprint = "85f0dbe19c3d05a4d3fb9cc6388d4155e845802e0803d3b9a48d1cdd3b61e02d" +serialized_bytes_length = 93443 +[[entries]] +file_name = "org.scala-lang_scalap_2.13.10.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "9a0a45ca8a43cb066962f0f316d7993a01fca44651498ca60e036ab042274811" +serialized_bytes_length = 527292 +[[entries]] +file_name = "org.scalameta_common_2.13_4.7.8.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" +[entries.file_digest] +fingerprint = "56c3cdc7120fceaa1e91284b8850d9023a3a8f7a4e37c75cbbcc03a243281b7f" +serialized_bytes_length = 2462932 +[[entries]] +file_name = "org.scalameta_fastparse-v2_2.13_2.3.1.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "8fca8597ad6d7c13c48009ee13bbe80c176b08ab12e68af54a50f7f69d8447c5" +serialized_bytes_length = 320855 +[[entries]] +file_name = "org.scalameta_parsers_2.13_4.7.8.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" +[entries.file_digest] +fingerprint = "7cd2a0574c990a4c273432d8264002a3dcd90abae0f601b699fe62b2709a32e5" +serialized_bytes_length = 1218445 +[[entries]] +file_name = "org.scalameta_scalameta_2.13_4.7.8.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" +[entries.file_digest] +fingerprint = "2c5191c904f4413bea273e32e87f12015b1ad070a67fa66029a735984cfb22e1" +serialized_bytes_length = 816833 +[[entries]] +file_name = "org.scalameta_semanticdb-scalac-core_2.13.11_4.7.8.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.dependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.11" +version = "4.7.8" +packaging = "jar" +[entries.file_digest] +fingerprint = "1689732be51d6351c8a75891fbbf054c8ed112c25d3c4dac5fe724abefff30a9" +serialized_bytes_length = 289727 +[[entries]] +file_name = "org.scalameta_semanticdb-scalac_2.13.12_4.8.14.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "semanticdb-scalac_2.13.12" +version = "4.8.14" +packaging = "jar" +[entries.file_digest] +fingerprint = "516da9260db08ec221f712eaf3c454a693121ebd64da501200bbf29dd28fcfc4" +serialized_bytes_length = 17218706 +[[entries]] +file_name = "org.scalameta_trees_2.13_4.7.8.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.7.8" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.7.8" +packaging = "jar" +[entries.file_digest] +fingerprint = "5edc930263e003a6cd4f2297204e71a4bcfb160e8f9b0c1db6d80267a411bcb7" +serialized_bytes_length = 5886418 +[[entries]] +file_name = "org.typelevel_paiges-core_2.13_0.4.2.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" +[entries.file_digest] +fingerprint = "9484ac95856510459d1bd52a77a6b93cdd641560decdf9910395ee4d17e88163" +serialized_bytes_length = 121417 diff --git a/src/python/pants/backend/scala/lint/scalafix/scala3.test.lock b/src/python/pants/backend/scala/lint/scalafix/scala3.test.lock new file mode 100644 index 00000000000..f183f78a15e --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/scala3.test.lock @@ -0,0 +1,49 @@ +# This lockfile was autogenerated by Pants. To regenerate, run: +# +# pants internal-generate-test-lockfile-fixtures :: +# +# --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +# { +# "version": 1, +# "generated_with_requirements": [ +# "org.scala-lang:scala3-library_3:3.3.1,url=not_provided,jar=not_provided" +# ] +# } +# --- END PANTS LOCKFILE METADATA --- + +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.scala-lang_scala-library_2.13.10.jar" + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "e6ca607c3fce03e8fa38af3374ce1f8bb098e316e8bf6f6d27331360feddb1c1" +serialized_bytes_length = 5949244 +[[entries]] +file_name = "org.scala-lang_scala3-library_3_3.3.1.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.10" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala3-library_3" +version = "3.3.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "b64c13c1f3d1ac2323457ec6cc09e9b38d7a9ef6889a1a0063601bf25d545508" +serialized_bytes_length = 1263932 diff --git a/src/python/pants/backend/scala/lint/scalafix/scalafix.default.lockfile.txt b/src/python/pants/backend/scala/lint/scalafix/scalafix.default.lockfile.txt new file mode 100644 index 00000000000..f5916a09e3f --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/scalafix.default.lockfile.txt @@ -0,0 +1,2133 @@ +# This lockfile was autogenerated by Pants. To regenerate, run: +# +# pants generate-lockfiles +# +# --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +# { +# "version": 1, +# "generated_with_requirements": [ +# "ch.epfl.scala:scalafix-cli_2.13.12:0.11.1,url=not_provided,jar=not_provided" +# ] +# } +# --- END PANTS LOCKFILE METADATA --- + +[[entries]] +file_name = "ch.epfl.scala_scalafix-cli_2.13.12_0.11.1.jar" +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-interfaces" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-reflect_2.13.12" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "pprint_2.13" +version = "0.6.6" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.martiansoftware" +artifact = "nailgun-server" +version = "0.9.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.apache.commons" +artifact = "commons-text" +version = "1.10.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.eclipse.jgit" +artifact = "org.eclipse.jgit" +version = "5.13.2.202306221912-r" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-java8-compat_2.13" +version = "1.0.2" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-interfaces" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-reflect_2.13.12" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.javaewah" +artifact = "JavaEWAH" +version = "1.1.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "pprint_2.13" +version = "0.6.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.martiansoftware" +artifact = "nailgun-server" +version = "0.9.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "io.get-coursier" +artifact = "interface" +version = "1.0.18" +packaging = "jar" + +[[entries.dependencies]] +group = "org.apache.commons" +artifact = "commons-lang3" +version = "3.12.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.apache.commons" +artifact = "commons-text" +version = "1.10.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.eclipse.jgit" +artifact = "org.eclipse.jgit" +version = "5.13.2.202306221912-r" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-java8-compat_2.13" +version = "1.0.2" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.12" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-cli_2.13.12" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "98b086b1a22ccf4ee46340f05fedc59f27acd48b16c657122c369949a55a77f5" +serialized_bytes_length = 221882 +[[entries]] +file_name = "ch.epfl.scala_scalafix-core_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "6fc795881091143b6644530edd263f1151449116d2e2dc4616dc0820b4b07878" +serialized_bytes_length = 1129891 +[[entries]] +file_name = "ch.epfl.scala_scalafix-interfaces_0.11.1.jar" +[[entries.directDependencies]] +group = "io.get-coursier" +artifact = "interface" +version = "1.0.18" +packaging = "jar" + +[[entries.dependencies]] +group = "io.get-coursier" +artifact = "interface" +version = "1.0.18" +packaging = "jar" + +[[entries.dependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-interfaces" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "f00f3400cedc239702a04b340c8dde6dd3e47ee1c576b29dab09d3124ae091d0" +serialized_bytes_length = 16320 +[[entries]] +file_name = "ch.epfl.scala_scalafix-reflect_2.13.12_0.11.1.jar" +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-reflect_2.13.12" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "63cc8c16a1dee22e7d10fab3dcf698ae835b002c778bca6386b9fd074441cd98" +serialized_bytes_length = 81781 +[[entries]] +file_name = "ch.epfl.scala_scalafix-rules_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.12" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "ch.epfl.scala" +artifact = "scalafix-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.12" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "ch.epfl.scala" +artifact = "scalafix-rules_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "1991f0729d2acb9d8ab84b9c5b31c8fed636b9ea5e86c9aad9c16edf18536f17" +serialized_bytes_length = 414687 +[[entries]] +file_name = "com.geirsson_metaconfig-core_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "26a731767c34ccf165ec86984c9e349d382a85ceaddd44bb438ac4970f89e0cb" +serialized_bytes_length = 527426 +[[entries]] +file_name = "com.geirsson_metaconfig-pprint_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "1df65fcac6437d2dd7bf244061b252e168bad49ee066bb4ddd17062a47ac0d6b" +serialized_bytes_length = 33886 +[[entries]] +file_name = "com.geirsson_metaconfig-typesafe-config_2.13_0.11.1.jar" +[[entries.directDependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-core_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.geirsson" +artifact = "metaconfig-pprint_2.13" +version = "0.11.1" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" + + +[entries.coord] +group = "com.geirsson" +artifact = "metaconfig-typesafe-config_2.13" +version = "0.11.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "d1c823e1eb7f794b49b36f2340994b56c5dcdd6d3e689ab536c07212c7f88d49" +serialized_bytes_length = 17265 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.google.protobuf_protobuf-java_3.19.6.jar" + +[entries.coord] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" +[entries.file_digest] +fingerprint = "6a9a2dff91dcf71f85be71ae971f6164b5a631dcd34bff08f0618535ca44ad02" +serialized_bytes_length = 1664824 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.googlecode.java-diff-utils_diffutils_1.3.0.jar" + +[entries.coord] +group = "com.googlecode.java-diff-utils" +artifact = "diffutils" +version = "1.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "61ba4dc49adca95243beaa0569adc2a23aedb5292ae78aa01186fa782ebdc5c2" +serialized_bytes_length = 34130 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.googlecode.javaewah_JavaEWAH_1.1.13.jar" + +[entries.coord] +group = "com.googlecode.javaewah" +artifact = "JavaEWAH" +version = "1.1.13" +packaging = "jar" +[entries.file_digest] +fingerprint = "4c0fda2b1d317750d7ea324e36c70b2bc48310c0aaae67b98df0915d696d7111" +serialized_bytes_length = 166895 +[[entries]] +file_name = "com.lihaoyi_fansi_2.13_0.3.0.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + + +[entries.coord] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "2f1d4cdd8971ef2cca8c37da8a04cb0ecf94bc89e59c6383185e88cde21f2e86" +serialized_bytes_length = 64609 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.lihaoyi_geny_2.13_0.6.5.jar" + +[entries.coord] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" +[entries.file_digest] +fingerprint = "ca3857a3f95266e0d87e1a1f26c8592c53c12ac7203f911759415f6c8a43df7d" +serialized_bytes_length = 85365 +[[entries]] +file_name = "com.lihaoyi_pprint_2.13_0.6.6.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "fansi_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + + +[entries.coord] +group = "com.lihaoyi" +artifact = "pprint_2.13" +version = "0.6.6" +packaging = "jar" +[entries.file_digest] +fingerprint = "c4f89810da70c3100b52458a85f8d520f54243e05047b98e829e2473f0092283" +serialized_bytes_length = 165433 +[[entries]] +file_name = "com.lihaoyi_sourcecode_2.13_0.3.0.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "6e5b2d55e942b450a222bfd3ebc23e99ca03716e42da25af1b2c8cde038100f5" +serialized_bytes_length = 119136 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.martiansoftware_nailgun-server_0.9.1.jar" + +[entries.coord] +group = "com.martiansoftware" +artifact = "nailgun-server" +version = "0.9.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "4518faa6bf4bd26fccdc4d85e1625dc679381a08d56872d8ad12151dda9cef25" +serialized_bytes_length = 32927 +[[entries]] +file_name = "com.thesamet.scalapb_lenses_2.13_0.11.13.jar" +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" +[entries.file_digest] +fingerprint = "74aa56d451c8faa5566b124c0de20ac7f6c3d9205d866d99a9fbe7e29662ad65" +serialized_bytes_length = 34951 +[[entries]] +file_name = "com.thesamet.scalapb_scalapb-runtime_2.13_0.11.13.jar" +[[entries.directDependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" +[entries.file_digest] +fingerprint = "4d17f874f06a5d9171cb6c41347a2b2906f4448a60d48aa8df4153abef23022f" +serialized_bytes_length = 2405377 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "com.typesafe_config_1.4.1.jar" + +[entries.coord] +group = "com.typesafe" +artifact = "config" +version = "1.4.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "4c0aa7e223c75c8840c41fc183d4cd3118140a1ee503e3e08ce66ed2794c948f" +serialized_bytes_length = 295197 +[[entries]] +file_name = "io.get-coursier_interface_1.0.18.jar" +[[entries.directDependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + +[[entries.dependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + + +[entries.coord] +group = "io.get-coursier" +artifact = "interface" +version = "1.0.18" +packaging = "jar" +[entries.file_digest] +fingerprint = "0bcc41a48f0660e12a98eb73e0e5cc8723b4470a6c0263c394c5bcbcdda37bfd" +serialized_bytes_length = 9824729 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "io.github.java-diff-utils_java-diff-utils_4.12.jar" + +[entries.coord] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5" +serialized_bytes_length = 72305 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "net.java.dev.jna_jna_5.13.0.jar" + +[entries.coord] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb" +serialized_bytes_length = 1879325 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.apache.commons_commons-lang3_3.12.0.jar" + +[entries.coord] +group = "org.apache.commons" +artifact = "commons-lang3" +version = "3.12.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "d919d904486c037f8d193412da0c92e22a9fa24230b9d67a57855c5c31c7e94e" +serialized_bytes_length = 587402 +[[entries]] +file_name = "org.apache.commons_commons-text_1.10.0.jar" +[[entries.directDependencies]] +group = "org.apache.commons" +artifact = "commons-lang3" +version = "3.12.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.apache.commons" +artifact = "commons-lang3" +version = "3.12.0" +packaging = "jar" + + +[entries.coord] +group = "org.apache.commons" +artifact = "commons-text" +version = "1.10.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "770cd903fa7b604d1f7ef7ba17f84108667294b2b478be8ed1af3bffb4ae0018" +serialized_bytes_length = 238400 +[[entries]] +file_name = "org.eclipse.jgit_org.eclipse.jgit_5.13.2.202306221912-r.jar" +[[entries.directDependencies]] +group = "com.googlecode.javaewah" +artifact = "JavaEWAH" +version = "1.1.13" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + +[[entries.dependencies]] +group = "com.googlecode.javaewah" +artifact = "JavaEWAH" +version = "1.1.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" + + +[entries.coord] +group = "org.eclipse.jgit" +artifact = "org.eclipse.jgit" +version = "5.13.2.202306221912-r" +packaging = "jar" +[entries.file_digest] +fingerprint = "3976011c36095b1445f108fce71fdb0717f82fbf950a2d2b71005b1353b65e86" +serialized_bytes_length = 2840722 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.jline_jline_3.22.0.jar" + +[entries.coord] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "7c3ec8d2c5815188bbaefa4c7c42bc9b8ec172382ca026a4b4f3d113c0b5c3e3" +serialized_bytes_length = 1060013 +[[entries]] +file_name = "org.scala-lang.modules_scala-collection-compat_2.13_2.11.0.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" +[entries.file_digest] +fingerprint = "0c1108883b7b97851750e8932f9584346ccb23f1260c197f97295ac2e6c56cec" +serialized_bytes_length = 7090 +[[entries]] +file_name = "org.scala-lang.modules_scala-java8-compat_2.13_1.0.2.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang.modules" +artifact = "scala-java8-compat_2.13" +version = "1.0.2" +packaging = "jar" +[entries.file_digest] +fingerprint = "90d5b13656be93fb779b8d7c723efa2498a34af06273bb5204afb65f85a20c1b" +serialized_bytes_length = 640088 +[[entries]] +file_name = "org.scala-lang_scala-compiler_2.13.12.jar" +[[entries.directDependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.dependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "583adb1ffa7b29fdbfdd6f4c97a396af06a8a91625d059823bba1b7172242d6a" +serialized_bytes_length = 12200301 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.scala-lang_scala-library_2.13.12.jar" + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "c6a879e4973a60f6162668542a33eaccc2bb565d1c934fb061c5844259131dd1" +serialized_bytes_length = 5917034 +[[entries]] +file_name = "org.scala-lang_scala-reflect_2.13.12.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "c648ceb93a9fcbd22603e0be3d6a156723ae661f516c772a550a088bb3cbca7a" +serialized_bytes_length = 3775795 +[[entries]] +file_name = "org.scala-lang_scalap_2.13.11.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" +[entries.file_digest] +fingerprint = "ac358699f40002fb4f32ad77531765fce23425d0e83c51854d1635118ab285ea" +serialized_bytes_length = 527352 +[[entries]] +file_name = "org.scalameta_common_2.13_4.8.10.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "137d07baa33d8fb5243f1e399b4d210b929ce8a5d3b9ec70c9de8e875265d0d4" +serialized_bytes_length = 2462815 +[[entries]] +file_name = "org.scalameta_fastparse-v2_2.13_2.3.1.jar" +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.directDependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "geny_2.13" +version = "0.6.5" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "fastparse-v2_2.13" +version = "2.3.1" +packaging = "jar" +[entries.file_digest] +fingerprint = "8fca8597ad6d7c13c48009ee13bbe80c176b08ab12e68af54a50f7f69d8447c5" +serialized_bytes_length = 320855 +[[entries]] +file_name = "org.scalameta_parsers_2.13_4.8.10.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "27dc6e6da71938717df932236a6301bb98dd1f13f93adaee169ea5408e8f780b" +serialized_bytes_length = 1263290 +[[entries]] +file_name = "org.scalameta_scalameta_2.13_4.8.10.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "482bc472be542a43badc1d19b54bedaf2bfc258a433ac6a4c53dd31baa16eb5f" +serialized_bytes_length = 809757 +[[entries]] +file_name = "org.scalameta_semanticdb-scalac-core_2.13.12_4.8.10.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "io.github.java-diff-utils" +artifact = "java-diff-utils" +version = "4.12" +packaging = "jar" + +[[entries.dependencies]] +group = "net.java.dev.jna" +artifact = "jna" +version = "5.13.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.jline" +artifact = "jline" +version = "3.22.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-compiler" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-reflect" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scalap" +version = "2.13.11" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "parsers_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "scalameta_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "semanticdb-scalac-core_2.13.12" +version = "4.8.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "eaafc757c932efb6a1d49337546f1f645f467ac18803233ee0370941cb9a1bd5" +serialized_bytes_length = 294684 +[[entries]] +file_name = "org.scalameta_trees_2.13_4.8.10.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.directDependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + +[[entries.dependencies]] +group = "com.google.protobuf" +artifact = "protobuf-java" +version = "3.19.6" +packaging = "jar" + +[[entries.dependencies]] +group = "com.lihaoyi" +artifact = "sourcecode_2.13" +version = "0.3.0" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "lenses_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "com.thesamet.scalapb" +artifact = "scalapb-runtime_2.13" +version = "0.11.13" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang.modules" +artifact = "scala-collection-compat_2.13" +version = "2.11.0" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scalameta" +artifact = "common_2.13" +version = "4.8.10" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "trees_2.13" +version = "4.8.10" +packaging = "jar" +[entries.file_digest] +fingerprint = "998c9104557d13de9ac1011545c7f958383574f4adde02f0a5ad2f6da3774159" +serialized_bytes_length = 6359786 +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.slf4j_slf4j-api_1.7.36.jar" + +[entries.coord] +group = "org.slf4j" +artifact = "slf4j-api" +version = "1.7.36" +packaging = "jar" +[entries.file_digest] +fingerprint = "d3ef575e3e4979678dc01bf1dcce51021493b4d11fb7f1be8ad982877c16a1c0" +serialized_bytes_length = 41125 +[[entries]] +file_name = "org.typelevel_paiges-core_2.13_0.4.2.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.typelevel" +artifact = "paiges-core_2.13" +version = "0.4.2" +packaging = "jar" +[entries.file_digest] +fingerprint = "9484ac95856510459d1bd52a77a6b93cdd641560decdf9910395ee4d17e88163" +serialized_bytes_length = 121417 diff --git a/src/python/pants/backend/scala/lint/scalafix/semanticdb-scalac-2.13.12.test.lock b/src/python/pants/backend/scala/lint/scalafix/semanticdb-scalac-2.13.12.test.lock new file mode 100644 index 00000000000..7bcc16cc4f6 --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/semanticdb-scalac-2.13.12.test.lock @@ -0,0 +1,50 @@ +# This lockfile was autogenerated by Pants. To regenerate, run: +# +# pants internal-generate-test-lockfile-fixtures :: +# +# --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +# { +# "version": 1, +# "generated_with_requirements": [ +# "org.scala-lang:scala-library:2.13.12,url=not_provided,jar=not_provided", +# "org.scalameta:semanticdb-scalac_2.13.12:4.8.14,url=not_provided,jar=not_provided" +# ] +# } +# --- END PANTS LOCKFILE METADATA --- + +[[entries]] +directDependencies = [] +dependencies = [] +file_name = "org.scala-lang_scala-library_2.13.12.jar" + +[entries.coord] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" +[entries.file_digest] +fingerprint = "c6a879e4973a60f6162668542a33eaccc2bb565d1c934fb061c5844259131dd1" +serialized_bytes_length = 5917034 +[[entries]] +file_name = "org.scalameta_semanticdb-scalac_2.13.12_4.8.14.jar" +[[entries.directDependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + +[[entries.dependencies]] +group = "org.scala-lang" +artifact = "scala-library" +version = "2.13.12" +packaging = "jar" + + +[entries.coord] +group = "org.scalameta" +artifact = "semanticdb-scalac_2.13.12" +version = "4.8.14" +packaging = "jar" +[entries.file_digest] +fingerprint = "516da9260db08ec221f712eaf3c454a693121ebd64da501200bbf29dd28fcfc4" +serialized_bytes_length = 17218706 diff --git a/src/python/pants/backend/scala/lint/scalafix/subsystem.py b/src/python/pants/backend/scala/lint/scalafix/subsystem.py new file mode 100644 index 00000000000..826b92ac65e --- /dev/null +++ b/src/python/pants/backend/scala/lint/scalafix/subsystem.py @@ -0,0 +1,78 @@ +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). +from __future__ import annotations + +from pants.core.util_rules.config_files import OrphanFilepathConfigBehavior +from pants.engine.addresses import UnparsedAddressInputs +from pants.jvm.resolve.jvm_tool import JvmToolBase +from pants.option.option_types import BoolOption, EnumOption, SkipOption, StrListOption, StrOption +from pants.util.memo import memoized_property +from pants.util.strutil import softwrap + +DEFAULT_SCALAFIX_CONFIG_FILENAME = ".scalafix.conf" + + +class ScalafixSubsystem(JvmToolBase): + options_scope = "scalafix" + name = "scalafix" + help = "scalafix (https://scalacenter.github.io/scalafix/)" + + default_version = "0.11.1" + default_artifacts = ("ch.epfl.scala:scalafix-cli_2.13.12:{version}",) + default_lockfile_resource = ( + "pants.backend.scala.lint.scalafix", + "scalafix.default.lockfile.txt", + ) + + config_file_name = StrOption( + default=DEFAULT_SCALAFIX_CONFIG_FILENAME, + advanced=True, + help=softwrap( + """ + Name of a config file understood by scalafix (https://scalacenter.github.io/scalafix/docs/users/configuration.html). + The plugin will search the ancestors of each directory in which Scala files are found for a config file of this name. + """ + ), + ) + + orphan_files_behavior = EnumOption( + default=OrphanFilepathConfigBehavior.ERROR, + advanced=True, + help=softwrap( + f""" + Whether to ignore, error or show a warning when files are found that are not + covered by the config file provided in `[{options_scope}].config_file_name` setting. + """ + ), + ) + + semantic_rules = BoolOption( + default=True, + advanced=True, + help=softwrap( + """ + Whether semantic rules are enabled or not. + + Using semantic rules requires the usage of the `semanticdb-scalac` plugin + and will trigger compilation of the source code before running scalafix on + the sources. + """ + ), + ) + + _rule_targets = StrListOption( + advanced=True, help="List of targets providing additional Scalafix rules." + ) + + skip = SkipOption("fix", "lint") + + @memoized_property + def rule_targets(self) -> UnparsedAddressInputs | None: + if not self._rule_targets: + return None + + return UnparsedAddressInputs( + self._rule_targets, + owning_address=None, + description_of_origin=f"the `[{self.options_scope}].extra_rule_targets` subsystem option", + ) diff --git a/src/python/pants/backend/scala/lint/scalafmt/skip_field.py b/src/python/pants/backend/scala/lint/scalafmt/skip_field.py index df3b9c905c1..c2cfe7a0867 100644 --- a/src/python/pants/backend/scala/lint/scalafmt/skip_field.py +++ b/src/python/pants/backend/scala/lint/scalafmt/skip_field.py @@ -1,7 +1,7 @@ # Copyright 2021 Pants project contributors (see CONTRIBUTORS.md). # Licensed under the Apache License, Version 2.0 (see LICENSE). -from pants.backend.scala.target_types import ScalaSourcesGeneratorTarget, ScalaSourceTarget +from pants.backend.scala.target_types import SCALA_SOURCES_TARGET_TYPES from pants.engine.target import BoolField @@ -12,7 +12,4 @@ class SkipScalafmtField(BoolField): def rules(): - return [ - ScalaSourceTarget.register_plugin_field(SkipScalafmtField), - ScalaSourcesGeneratorTarget.register_plugin_field(SkipScalafmtField), - ] + return [tgt.register_plugin_field(SkipScalafmtField) for tgt in SCALA_SOURCES_TARGET_TYPES] diff --git a/src/python/pants/backend/scala/target_types.py b/src/python/pants/backend/scala/target_types.py index e8cf5112456..8a7b4774fa3 100644 --- a/src/python/pants/backend/scala/target_types.py +++ b/src/python/pants/backend/scala/target_types.py @@ -593,6 +593,16 @@ async def generate_jvm_artifact_targets( return GeneratedTargets(request.generator, (jvm_artifact_target,)) +SCALA_SOURCES_TARGET_TYPES: list[type[Target]] = [ + ScalaSourceTarget, + ScalaSourcesGeneratorTarget, + ScalatestTestTarget, + ScalatestTestsGeneratorTarget, + ScalaJunitTestTarget, + ScalaJunitTestsGeneratorTarget, +] + + def rules(): return ( *collect_rules(), diff --git a/src/python/pants/backend/scala/util_rules/versions.py b/src/python/pants/backend/scala/util_rules/versions.py index 35015619f16..bacd13fcc27 100644 --- a/src/python/pants/backend/scala/util_rules/versions.py +++ b/src/python/pants/backend/scala/util_rules/versions.py @@ -5,6 +5,7 @@ import re from dataclasses import dataclass from enum import Enum +from typing import Any from pants.engine.rules import collect_rules, rule from pants.jvm.resolve.coordinate import Coordinate @@ -61,6 +62,26 @@ def crossversion(self, mode: ScalaCrossVersionMode) -> str: def binary(self) -> str: return self.crossversion(ScalaCrossVersionMode.BINARY) + def __eq__(self, other: Any) -> bool: + return ( + isinstance(other, ScalaVersion) + and other.major == self.major + and other.minor == self.minor + and other.patch == self.patch + and other.suffix == self.suffix + ) + + def __gt__(self, other: Any) -> bool: + if isinstance(other, ScalaVersion): + if self.major > other.major: + return True + elif (self.major == other.major) and (self.minor > other.minor): + return True + elif (self.major == other.major) and (self.minor == other.minor): + return self.patch > other.patch + return False + return False + def __str__(self) -> str: version_str = f"{self.major}.{self.minor}.{self.patch}" if self.suffix: diff --git a/src/python/pants/backend/scala/util_rules/versions_test.py b/src/python/pants/backend/scala/util_rules/versions_test.py index 85ddf19d360..e2d5e69ba64 100644 --- a/src/python/pants/backend/scala/util_rules/versions_test.py +++ b/src/python/pants/backend/scala/util_rules/versions_test.py @@ -25,3 +25,19 @@ def test_scala_version_parser( assert parsed.crossversion(ScalaCrossVersionMode.PARTIAL) == parsed.crossversion( ScalaCrossVersionMode.BINARY ) + + +@pytest.mark.parametrize( + "lhs, rhs, expected", + [ + (ScalaVersion(2, 2, 0), ScalaVersion(1, 0, 5), True), + (ScalaVersion(2, 2, 1), ScalaVersion(2, 2, 0), True), + (ScalaVersion(2, 2, 0), ScalaVersion(2, 2, 1), False), + (ScalaVersion(1, 1, 0), ScalaVersion(1, 0, 0), True), + (ScalaVersion(1, 0, 0), ScalaVersion(1, 0, 0), False), + (ScalaVersion(1, 0, 1), ScalaVersion(1, 1, 0), False), + (ScalaVersion(1, 2, 0), ScalaVersion(2, 0, 1), False), + ], +) +def test_scala_version_greater_than(lhs: ScalaVersion, rhs: ScalaVersion, expected: bool) -> None: + assert (lhs > rhs) == expected diff --git a/src/python/pants/bin/BUILD b/src/python/pants/bin/BUILD index 847b603ae5b..7ba02811a31 100644 --- a/src/python/pants/bin/BUILD +++ b/src/python/pants/bin/BUILD @@ -69,6 +69,7 @@ target( "src/python/pants/backend/experimental/rust", "src/python/pants/backend/experimental/scala", "src/python/pants/backend/experimental/scala/debug_goals", + "src/python/pants/backend/experimental/scala/lint/scalafix", "src/python/pants/backend/experimental/scala/lint/scalafmt", "src/python/pants/backend/experimental/swift", "src/python/pants/backend/experimental/terraform", diff --git a/testprojects/src/jvm/org/pantsbuild/example/app/BUILD b/testprojects/src/jvm/org/pantsbuild/example/app/BUILD index 27d0c8d45ab..abe5b920c91 100644 --- a/testprojects/src/jvm/org/pantsbuild/example/app/BUILD +++ b/testprojects/src/jvm/org/pantsbuild/example/app/BUILD @@ -7,4 +7,4 @@ deploy_jar( dependencies=[":app"], ) -scala_sources() +scala_sources(scalac_plugins=["semanticdb"])