Skip to content

Commit

Permalink
remove dialect and use scalaVersion
Browse files Browse the repository at this point in the history
  • Loading branch information
mlachkar committed May 10, 2021
1 parent 5a4f85d commit f765918
Show file tree
Hide file tree
Showing 17 changed files with 239 additions and 98 deletions.
1 change: 0 additions & 1 deletion project/Mima.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ object Mima {
ProblemFilters.exclude[Problem]("scala.tools.nsc.interactive.*"),
ProblemFilters.exclude[Problem]("scalafix.syntax.package.XtensionDocument"),
ProblemFilters.exclude[MissingClassProblem]("scalafix.syntax.package$XtensionDocument"),
ProblemFilters.exclude[ReversedMissingMethodProblem]("scalafix.interfaces.ScalafixArguments.withDialect"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scalafix.interfaces.ScalafixEvaluation.getErrors"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scalafix.interfaces.ScalafixEvaluation.getMessageError"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scalafix.interfaces.ScalafixFileEvaluation.getErrors"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,24 @@ import java.nio.file.Path
import java.nio.file.PathMatcher
import java.util
import java.util.Optional

import scala.jdk.CollectionConverters._
import scala.util.control.NoStackTrace

import scala.meta.io.AbsolutePath
import scala.meta.io.Classpath

import coursierapi.Repository
import metaconfig.Conf
import metaconfig.Configured
import scalafix.Versions
import scalafix.cli.ExitStatus
import scalafix.interfaces._
import scalafix.internal.config.ScalafixConfig
import scalafix.internal.config.ScalaVersion
import scalafix.internal.v1.Args
import scalafix.internal.v1.MainOps
import scalafix.internal.v1.Rules
import scalafix.v1.RuleDecoder

import scala.util.{Failure, Success}

final case class ScalafixArgumentsImpl(args: Args = Args.default)
extends ScalafixArguments {

Expand Down Expand Up @@ -124,14 +123,6 @@ final case class ScalafixArgumentsImpl(args: Args = Args.default)
copy(args = args.copy(triggered = true))
}

override def withDialect(dialect: ScalafixDialect): ScalafixArguments =
dialect match {
case ScalafixDialect.Scala2 =>
copy(args = args.copy(dialect = ScalafixConfig.Scala2))
case ScalafixDialect.Scala3 =>
copy(args = args.copy(dialect = ScalafixConfig.Scala3))
}

override def withParsedArguments(
args: util.List[String]
): ScalafixArguments = {
Expand Down Expand Up @@ -200,8 +191,16 @@ final case class ScalafixArgumentsImpl(args: Args = Args.default)
): ScalafixArguments =
copy(args = args.copy(scalacOptions = options.asScala.toList))

override def withScalaVersion(version: String): ScalafixArguments =
copy(args = args.copy(scalaVersion = version))
override def withScalaVersion(version: String): ScalafixArguments = {
ScalaVersion
.from(version) match {
case Success(value) => copy(args = args.copy(scalaVersion = value))
case Failure(exception) =>
throw new ScalafixMainArgsException(
s"Failed when parsing Scala Version because: ${exception.getMessage}"
)
}
}

override def validate(): Optional[ScalafixException] = {
args.validate match {
Expand Down
45 changes: 24 additions & 21 deletions scalafix-cli/src/main/scala/scalafix/internal/v1/Args.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,14 @@ import java.nio.file.PathMatcher
import java.nio.file.Paths
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException

import scala.annotation.StaticAnnotation
import scala.util.Failure
import scala.util.Success
import scala.util.Try

import scala.meta.Dialect
import scala.meta.internal.io.PathIO
import scala.meta.internal.symtab.SymbolTable
import scala.meta.io.AbsolutePath
import scala.meta.io.Classpath

import metaconfig.Configured._
import metaconfig._
import metaconfig.annotation._
Expand All @@ -33,8 +29,9 @@ import pprint.TPrint
import scalafix.interfaces.ScalafixMainCallback
import scalafix.internal.config.FilterMatcher
import scalafix.internal.config.PrintStreamReporter
import scalafix.internal.config.ScalaVersion
import scalafix.internal.config.ScalaVersion.scala2
import scalafix.internal.config.ScalafixConfig
import scalafix.internal.config.ScalafixMetaconfigReaders
import scalafix.internal.diff.DiffDisable
import scalafix.internal.interfaces.MainCallbackImpl
import scalafix.internal.jgit.JGitDiff
Expand All @@ -57,7 +54,6 @@ case class Args(
@ExtraName("remainingArgs")
@ExtraName("f")
files: List[AbsolutePath] = Nil,
dialect: Dialect = ScalafixConfig.Scala2,
@Description(
"File path to a .scalafix.conf configuration file. " +
"Defaults to .scalafix.conf in the current working directory, if any."
Expand Down Expand Up @@ -127,9 +123,10 @@ case class Args(
)
scalacOptions: List[String] = Nil,
@Description(
"The Scala compiler version that was used to compile this project."
"The Scala compiler version that the provided files are targeting, " +
"or the actual version that was used to compile them when a classpath is provided."
)
scalaVersion: String = scala.util.Properties.versionNumberString,
scalaVersion: ScalaVersion = Args.runtimeScalaVersion,
@Section("Tab completions")
@Description(
"""|Print out bash tab completions. To install:
Expand Down Expand Up @@ -223,11 +220,6 @@ case class Args(
}
}

def configureDialect(
scalafixConfig: ScalafixConfig
): Configured[ScalafixConfig] =
Configured.ok(scalafixConfig.copy(dialect = dialect))

def fileConfig: Configured[Conf] = {
val toRead: Option[AbsolutePath] = config.orElse {
val defaultPath = cwd.resolve(".scalafix.conf")
Expand Down Expand Up @@ -294,7 +286,7 @@ case class Args(

val configuration = Configuration()
.withConf(targetConf)
.withScalaVersion(scalaVersion)
.withScalaVersion(scalaVersion.value)
.withScalacOptions(scalacOptions)
.withScalacClasspath(validatedClasspath.entries)
decoder.read(rulesConf).andThen(_.withConfiguration(configuration))
Expand Down Expand Up @@ -340,6 +332,12 @@ case class Args(
}
}

def configureScalaVersion(
conf: ScalafixConfig
): Configured[ScalafixConfig] = {
Configured.Ok(conf.copy(scalaVersion = scalaVersion))
}

def configuredSourceroot: Configured[AbsolutePath] = {
val path = sourceroot.getOrElse(cwd)
if (path.isDirectory) Configured.ok(path)
Expand Down Expand Up @@ -371,7 +369,7 @@ case class Args(
settingInScala2: String,
settingInScala3Opt: Option[String]
): Option[String] = {
if (scalaVersion.isEmpty || scalaVersion.startsWith("2")) {
if (scalaVersion.isScala2) {
val flag = s"-P:semanticdb:$settingInScala2:"
scalacOptions
.filter(_.startsWith(flag))
Expand Down Expand Up @@ -407,7 +405,7 @@ case class Args(
configuredRules(base, scalafixConfig) |@|
resolvedPathReplace |@|
configuredDiffDisable |@|
configureDialect(scalafixConfig)
configureScalaVersion(scalafixConfig)
).map {
case (
((((root, symtab), rulez), pathReplace), diffDisable),
Expand All @@ -433,6 +431,11 @@ case class Args(
object Args {
val baseMatcher: PathMatcher =
FileSystems.getDefault.getPathMatcher("glob:**.{scala,sbt}")
val runtimeScalaVersion = ScalaVersion
.from(scala.util.Properties.versionNumberString) // can be empty
.toOption
.getOrElse(scala2)

val default: Args = default(PathIO.workingDirectory, System.out)
def default(cwd: AbsolutePath, out: PrintStream): Args = {
val callback = MainCallbackImpl.fromScala(PrintStreamReporter(out))
Expand Down Expand Up @@ -464,10 +467,11 @@ object Args {
ConfDecoder.stringConfDecoder.map(glob =>
FileSystems.getDefault.getPathMatcher("glob:" + glob)
)
implicit val dialectDecoder: ConfDecoder[Dialect] =
ScalafixMetaconfigReaders.dialectReader
implicit val dialectEncoder: ConfEncoder[Dialect] =
ConfEncoder.StringEncoder.contramap(_.toString)
implicit val scalaVersionDecoder: ConfDecoder[ScalaVersion] =
ScalafixConfig.scalaVersionDecoder

implicit val scalaVersionEncoder: ConfEncoder[ScalaVersion] =
ConfEncoder.StringEncoder.contramap(_.value)
implicit val callbackDecoder: ConfDecoder[ScalafixMainCallback] =
ConfDecoder.stringConfDecoder.map(_ => MainCallbackImpl.default)

Expand All @@ -487,7 +491,6 @@ object Args {
ConfEncoder.StringEncoder.contramap(_.toString)
implicit val callbackEncoder: ConfEncoder[ScalafixMainCallback] =
ConfEncoder.StringEncoder.contramap(_.toString)

implicit val argsEncoder: ConfEncoder[Args] = generic.deriveEncoder
implicit val absolutePathPrint: TPrint[AbsolutePath] =
TPrint.make[AbsolutePath](_ => "<path>")
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package scalafix.internal.config

import scala.util.Failure
import scala.util.Success
import scala.util.Try

import scala.meta.Dialect

import scalafix.internal.config.ScalaVersion._

/*
ScalaVersion allows to model major, minor and patch versions. The expected input is x[.x[.x]]].
All information stored after a dash are dropped. Example 3.0.0-RC3 will be modeled as ScalaVersion.Patch(3, 0, 0)
*/
sealed trait ScalaVersion {
val major: MajorVersion
val minor: Option[Int]
val patch: Option[Int]
val dialect: Dialect = major match {
case ScalaVersion.Major.Scala2 => scala.meta.dialects.Scala213
case ScalaVersion.Major.Scala3 => scala.meta.dialects.Scala3
}

def isScala2: Boolean = major == Major.Scala2
def isScala3: Boolean = major == Major.Scala3

def value: String = this match {
case Major(major) => s"${major.value}"
case Minor(major, minorVersion) => s"${major.value}.${minorVersion}"
case Patch(major, minorVersion, patchVersion) =>
s"${major.value}.${minorVersion}.$patchVersion"
}
}

object ScalaVersion {
val scala2: Major = Major(Major.Scala2)
val scala3: Major = Major(Major.Scala3)

case class Major(major: MajorVersion) extends ScalaVersion {
override val minor = None
override val patch = None
}
case class Minor(major: MajorVersion, minorVersion: Int)
extends ScalaVersion {
override val minor: Some[Int] = Some(minorVersion)
override val patch = None

}
case class Patch(major: MajorVersion, minorVersion: Int, patchVersion: Int)
extends ScalaVersion {
override val minor: Some[Int] = Some(minorVersion)
override val patch: Some[Int] = Some(patchVersion)
}

sealed trait MajorVersion {
val value: Int
}
object Major {
case object Scala2 extends MajorVersion {
override val value: Int = 2
}

case object Scala3 extends MajorVersion {
override val value: Int = 3
}
}

object MajorVersion {
def from(int: Long): Try[MajorVersion] =
int match {
case 2 => Success(Major.Scala2)
case 3 => Success(Major.Scala3)
case _ =>
Failure(
new Exception(s"Major Scala version can be either 2 or 3 not $int")
)
}
}

private val intPattern = """\d{1,2}"""
private val FullVersion =
raw"""($intPattern)\.($intPattern)\.($intPattern)""".r
private val MajorPattern = raw"""($intPattern)""".r
private val PartialVersion = raw"""($intPattern)\.($intPattern)""".r

def from(s: String): Try[ScalaVersion] = {
val version = s.split("-").head
version match {
case FullVersion(major, minor, patch) =>
MajorVersion.from(major.toLong).flatMap { major =>
Success(Patch(major, minor.toInt, patch.toInt))
}
case PartialVersion(major, minor) =>
MajorVersion.from(major.toLong).flatMap { major =>
Success(Minor(major, minor.toInt))
}
case MajorPattern(major) =>
MajorVersion.from(major.toLong).flatMap(major => Success(Major(major)))
case _ => Failure(new Exception(s"$s not a valid Scala Version."))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ case class ScalafixConfig(
fatalWarnings: Boolean = true,
reporter: ScalafixReporter = ScalafixReporter.default,
patches: ConfigRulePatches = ConfigRulePatches.default,
dialect: Dialect = ScalafixConfig.Scala2,
scalaVersion: ScalaVersion = ScalaVersion.scala2,
lint: LintConfig = LintConfig.default
) {
val dialect = scalaVersion.dialect

def dialectForFile(path: String): Dialect =
if (path.endsWith(".sbt")) DefaultSbtDialect
Expand All @@ -28,6 +29,10 @@ case class ScalafixConfig(

object ScalafixConfig {

implicit val scalaVersionDecoder: ConfDecoder[ScalaVersion] =
ConfDecoder.stringConfDecoder.map { version =>
ScalaVersion.from(version).get
}
lazy val default: ScalafixConfig = ScalafixConfig()
def decoder(default: ScalafixConfig): ConfDecoder[ScalafixConfig] =
generic.deriveDecoder[ScalafixConfig](default)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,6 @@ trait ScalafixMetaconfigReaders {
import scala.meta.parsers.Parse._
ReaderUtil.oneOf[MetaParser](parseSource, parseStat, parseCase)
}
implicit lazy val dialectReader: ConfDecoder[Dialect] = {
import scalafix.internal.config.ScalafixConfig._
ReaderUtil.oneOf[Dialect](
Scala2,
Scala3
)
}

object UriRuleString {
def unapply(arg: Conf.Str): Option[(String, String)] =
Expand Down
Loading

0 comments on commit f765918

Please sign in to comment.